我刚刚在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/

10-10 08:32