ios - 使用 AVAudioEngine 进行电平测量

标签 ios objective-c macos avfoundation avaudioengine

我刚刚在 AVAudioEngine 上观看了 WWDC 视频(Session 502 AVAudioEngine in Practice),我非常兴奋能够制作基于该技术的应用。

我还没想好如何对麦克风输入或调音台输出进行电平监控。

有人可以帮忙吗?明确地说,我说的是监控当前输入信号(并在 UI 中显示),而不是 channel /轨道的输入/输出音量设置。

我知道你可以用 AVAudioRecorder 做到这一点,但这不是 AVAudioEngine 需要的 AVAudioNode

最佳答案

尝试在主混音器上安装一个水龙头,然后通过设置帧长使其更快,然后读取样本并获得平均值,如下所示:

import framework on top

#import <Accelerate/Accelerate.h>

add property

@property float averagePowerForChannel0;
@property float averagePowerForChannel1;

then the below the same>>

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) ;
    }
}];

then, get the target value you want

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/

相关文章:

ios - 为什么 XCode 4.2 中的 three20 依赖项不再需要 -force_load?

ios - CoreData : warning: Unable to load class named 'WEEReadings' for entity 'Readings' . 找不到类,改用默认的 NSManagedObject

ios - Swift 3、XCode 8 - 按下按钮时更改本地视频 - AVPlayer

ios - 如何在 Collection View 中对单元格单击创建按钮操作

objective-c - 如何获取 QLPreviewView 内容并写入图像

c++ - 如何在 C++ 中确定进程所有者是否是 Mac OS X 上的管理员

ios - 快速加载 Firebase 数据时重新加载 View Controller

ios - Podfile:本地 pod 相对于 Projectpath 的路径可能吗?

Python:在一个文件行中检索两个单独的列表值

xcode - 如何在 Xcode 中跳过开发构建的代码签名?