首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >怎样才能使iPhone录音和播放的音量计看起来一样?

怎样才能使iPhone录音和播放的音量计看起来一样?
EN

Stack Overflow用户
提问于 2011-03-05 03:34:35
回答 2查看 911关注 0票数 1

我显示了一个音频电平测量仪,用于录制和回放该录音。等级值的取值范围为0- 1.0。我在屏幕上绘制了一个条形图,表示0- 1.0的值。要获取录音的音频级别,我使用以下命令:

代码语言:javascript
复制
OSStatus status = AudioQueueGetProperty(aqData.mQueue, kAudioQueueProperty_CurrentLevelMeter, aqLevelMeterState, &levelMeterStateDataSize);

float level = aqLevelMeterState[0].mAveragePower;

对于回放,我使用:

代码语言:javascript
复制
// soundPlayer is an AVSoundPlayer
float level = [soundPlayer averagePowerForChannel:0];

我将级别从0到1.0归一化。

现在,在显示工具栏时,它们看起来非常不同。录制计量器位于较低端,而回放计量器在播放同一录制的音频时,则处于较中间位置。

我试图让这两个米看起来一样,但我对音频还是相当陌生的。我做了一些研究,知道录音返回的是RMS值,回放返回的是分贝。

某个精通音频的人能给我指出链接或文档,或者给我一点提示,让我理解这两个值,这样我就可以开始让它们看起来一样吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-05 04:36:21

它是给定定时器间隔的RMS或均方根。RMS的计算方法是:将每个信号值的平方相加,求出样本数量,得到平均值,然后取平均值的平方根。

代码语言:javascript
复制
     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
EN

Stack Overflow用户

发布于 2011-03-05 11:03:04

分贝是按对数缩放的。因此,您可能需要一些公式,例如:

代码语言:javascript
复制
myDb = 20.0 * log (myRMS / scaleFactor);

在某个地方,你必须校准scaleFactor来匹配你想要的全比例的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5198387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档