如何让iPhone录制和播放音频电平表看起来一样?

问题描述 投票:1回答:2

我显示一个音频电平表,用于录制和播放该录音。级别值为0 - 1.0。我在屏幕上绘制一个代表0 - 1.0值的条形图。要获得录音的音频电平,我使用:

OSStatus status = AudioQueueGetProperty(aqData.mQueue, kAudioQueueProperty_CurrentLevelMeter, aqLevelMeterState, &levelMeterStateDataSize);

float level = aqLevelMeterState[0].mAveragePower;

对于播放,我使用:

// soundPlayer is an AVSoundPlayer
float level = [soundPlayer averagePowerForChannel:0];

我将级别从0到1.0标准化。

现在他们在展示酒吧时看起来非常不同。录音计量条更多地位于低端,而播放条表在播放相同录制的音频时,更多地位于中间。

我试图让两米看起来一样,但我对音频还是比较新的。我做了一些研究,并知道录音返回RMS值,播放以分贝为单位返回。

知识渊博的音频人员可以指向链接或文档,或者给出一些提示来理解这两个值,以便我可以开始使它们看起来一样吗?

objective-c iphone audio volume
2个回答
1
投票

它是给定计时器间隔的RMS或均方根。通过将总信号的每个信号值的平方相加来计算RMS,将得到的样本数除以得到均值,然后取平均值的平方根。

     uint64 avgTotal;
    for(int i =0; i < sampleCount; i++)
       avgTotal+= (sample[i]*sample[i])/(uint64)sampleCount; //divide to help with overlfow

    float rms = sqrt(avgTotal);

您必须充分了解所播放的数据以获取信号值。你考虑的时间的推移应该不重要。 50-80ms应该这样做。


1
投票

分贝以对数方式缩放。所以你可能想要一些方程式,例如:

myDb = 20.0 * log (myRMS / scaleFactor);

在某个地方,您必须校准scaleFactor以匹配您想要满量程的值。

© www.soinside.com 2019 - 2024. All rights reserved.