rabbit-dev

現役スマフォプログラマーが適当にプログラム関係の記事を放り込むブログ

マイクの音量を検出する方法

http://blog.koogawa.com/entry/2013/11/24/121807
このサイトのXamarin版です。

コード

https://gist.github.com/c2084778f54ebd07864180aea7f78040

private InputAudioQueue mAudioQueue;
private NSTimer mAudioTimer;

public void autoStart(){
    AudioStreamBasicDescription basic = new AudioStreamBasicDescription();
    basic.SampleRate = 44100.00;
    basic.Format = AudioFormatType.LinearPCM;
    basic.FormatFlags = AudioFormatFlags.LinearPCMIsBigEndian |
        AudioFormatFlags.LinearPCMIsSignedInteger |
        AudioFormatFlags.LinearPCMIsPacked;
    basic.BytesPerPacket = 2;
    basic.BytesPerFrame = 2;
    basic.FramesPerPacket = 1;
    basic.ChannelsPerFrame = 1;
    basic.BitsPerChannel = 16;

    mAudioQueue = new InputAudioQueue(basic);
    mAudioQueue.Start();
    mAudioQueue.EnableLevelMetering = true;

    mAudioTimer = NSTimer.CreateRepeatingTimer(0.5,(obj) => {
        workVolume();
    });
    NSRunLoop.Current.AddTimer(mAudioTimer, NSRunLoopMode.Default);
}

void workVolume(){
    int channel = 0;
    AudioQueueLevelMeterState [] levels = mAudioQueue.CurrentLevelMeterDB;
    Console.WriteLine("{0} {1}", levels[channel].AveragePower, levels[channel].PeakPower);
}

ログ

2017-04-21 01:11:34.869 .iOS[6469:2200702] -32.36877 -21.62641
2017-04-21 01:11:35.370 .iOS[6469:2200702] -29.79558 -20.17148
2017-04-21 01:11:35.870 .iOS[6469:2200702] -22.81933 -16.18644
2017-04-21 01:11:36.369 .iOS[6469:2200702] -25.22222 -16.18644
2017-04-21 01:11:36.870 .iOS[6469:2200702] -28.65407 -21.20195

ポイント

EnableLevelMeteringを有効にするタイミングが重要です。mAudioQueue.Start()の後じゃないと駄目です。 AveragePowerとPeakPowerの差が○○だったら何かを行うととかってコードを書くと色々できそう。