我显示一个音频电平表,用于录制和播放该录音。级别值为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值,播放以分贝为单位返回。
知识渊博的人能否指向我的链接或文档,或者给出一些提示来理解这两个值,以便我可以开始让它们看起来一样?
答案 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以匹配您想要满量程的值。