メイン ミキサーにタップをインストールし、フレーム長を設定して高速化し、サンプルを読み取って平均を取得します。次のようにします。
フレームワークを一番上にインポート
#import <Accelerate/Accelerate.h>
プロパティを追加
@property float averagePowerForChannel0;
@property float averagePowerForChannel1;
次に同じ>>
self.mainMixer = [self.engine mainMixerNode];
[self.mainMixer installTapOnBus:0 bufferSize:1024 format:[self.mainMixer outputFormatForBus:0] block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
[buffer setFrameLength:1024];
UInt32 inNumberFrames = buffer.frameLength;
if(buffer.format.channelCount>0)
{
Float32* samples = (Float32*)buffer.floatChannelData[0];
Float32 avgValue = 0;
vDSP_meamgv((Float32*)samples, 1, &avgValue, inNumberFrames);
self.averagePowerForChannel0 = (LEVEL_LOWPASS_TRIG*((avgValue==0)?-100:20.0*log10f(avgValue))) + ((1-LEVEL_LOWPASS_TRIG)*self.averagePowerForChannel0) ;
self.averagePowerForChannel1 = self.averagePowerForChannel0;
}
if(buffer.format.channelCount>1)
{
Float32* samples = (Float32*)buffer.floatChannelData[1];
Float32 avgValue = 0;
vDSP_meamgv((Float32*)samples, 1, &avgValue, inNumberFrames);
self.averagePowerForChannel1 = (LEVEL_LOWPASS_TRIG*((avgValue==0)?-100:20.0*log10f(avgValue))) + ((1-LEVEL_LOWPASS_TRIG)*self.averagePowerForChannel1) ;
}
}];
次に、必要な目標値を取得します
NSLog(@"===test===%.2f", self.averagePowerForChannel1);
ピーク値を取得するには、vDSP_meamgv の代わりに vDSP_maxmgv を使用します。
LEVEL_LOWPASS_TRIG は、0.0 から 1.0 までの値の単純なフィルターです。0.0 を設定すると、すべての値がフィルター処理され、データは取得されません。1.0 に設定すると、ノイズが多すぎます。基本的に、値が高いほど、データの変動が大きくなります。ほとんどのアプリケーションでは、0.10 から 0.30 の間の値が適しているようです。