如何使 iPhone 录音和播放音频电平表看起来一样?
Posted
技术标签:
【中文标题】如何使 iPhone 录音和播放音频电平表看起来一样?【英文标题】:How can I make the iPhone recording and playback audio level meter look the same? 【发布时间】:2011-03-04 19:34:35 【问题描述】:我显示一个音频电平表,用于录制和播放该录音。级别值介于 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 值,而播放返回的是以分贝为单位的。
音频方面的知识渊博的人可以给我指出链接或文档,或者给我一点提示来理解这两个值,以便我可以开始让它们看起来一样吗?
【问题讨论】:
【参考方案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 就可以了。
【讨论】:
嗯。由于记录是在 RMS 中,我将对播放值执行此操作。我想我会尝试使用分贝值作为样本,然后看看情况如何。谢谢! 这看起来不像。你说得对,我需要了解更多关于数据的信息。我想这就是我的问题主要是关于什么。他们说 mAveragePower 是 RMS,我有点明白那是什么,但他们用什么来得到它?平均功率是分贝的 RMS,然后归一化为 0 - 1.0 等吗?也许我会将其添加到问题中或发布后续问题以获取有关这些值的详细信息。 RMS 基于样本值。音频信号由给定采样率的样本组成。它真的与分贝无关。在此处阅读有关 PCM 的信息。 en.wikipedia.org/wiki/Pulse-code_modulation 可能会有所帮助。 感谢您抽出宝贵时间提供帮助。这肯定需要更多的研究。我现在的解决方案是让两者都返回分贝。我会处理那里的数据。 =)【参考方案2】:分贝是对数刻度的。所以你可能想要一些方程式,例如:
myDb = 20.0 * log (myRMS / scaleFactor);
在某个地方,您必须校准 scaleFactor 以匹配您想要的满量程值。
【讨论】:
以上是关于如何使 iPhone 录音和播放音频电平表看起来一样?的主要内容,如果未能解决你的问题,请参考以下文章