首页 文章

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

提问于
浏览
1

我显示一个音频电平表,用于录制和播放该录音 . 级别值为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 回答

  • 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

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

    myDb = 20.0 * log (myRMS / scaleFactor);
    

    在某个地方,您必须校准scaleFactor以匹配您想要满量程的值 .

相关问题