我刚刚在AVAudioEngine
上观看了WWDC视频(实践中的Session 502 AVAudioEngine
),并且为制作基于该技术的应用程序感到非常兴奋。
我还无法弄清楚如何对麦克风输入或调音台的输出进行电平监控。
有人可以帮忙吗?明确地说,我说的是监视当前输入信号(并在UI中显示),而不是监视 channel /音轨的输入/输出音量设置。
我知道您可以使用AVAudioRecorder
做到这一点,但这不是AVAudioNode
所需的AVAudioEngine
。
最佳答案
尝试在主混音器上安装一个水龙头,然后通过设置帧长使其更快,然后读取样本并取平均值,如下所示:
#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_maxmgv而不是vDSP_meamgv。
LEVEL_LOWPASS_TRIG是一个简单的过滤器,值介于0.0到1.0之间,如果设置为0.0,则将过滤所有值并且不获取任何数据。如果将其设置为1.0,则会产生过多的噪音。基本上,该值越高,数据的变化就越大。对于大多数应用而言,似乎介于0.10到0.30之间的值是好的。
关于ios - 使用AVAudioEngine进行电平表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30641439/