我显示了一个音频电平测量仪,用于录制和回放该录音。等级值的取值范围为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值,回放返回的是分贝。
某个精通音频的人能给我指出链接或文档,或者给我一点提示,让我理解这两个值,这样我就可以开始让它们看起来一样吗?
发布于 2011-03-05 04:36:21
它是给定定时器间隔的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应该可以。
发布于 2011-03-05 11:03:04
分贝是按对数缩放的。因此,您可能需要一些公式,例如:
myDb = 20.0 * log (myRMS / scaleFactor);在某个地方,你必须校准scaleFactor来匹配你想要的全比例的值。
https://stackoverflow.com/questions/5198387
复制相似问题