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

时间:2011-03-04 19:34:35

标签: objective-c iphone audio volume

我显示一个音频电平表,用于录制和播放该录音。级别值为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值,播放以分贝为单位返回。

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

myDb = 20.0 * log (myRMS / scaleFactor);
在某个地方,您必须校准scaleFactor以匹配您想要满量程的值。