在我的应用程序中,我允许用户使用手机的摄像头录制音频,而在录制过程中,我使用时间作为X值,并使用归一化的getMaxAmplitude()形式的y值更新了路径。

float amp = Math.min(mRecorder.getMaxAmplitude(), mMaxAmplitude)
                 / (float) mMaxAmplitude;

效果很好。

我去播放音频时(通过网络传输音频后)​​,会出现我的问题。我想重新创建在录制时生成的波形,但是MediaPlayer类不具有相同的getMaxAmplitude()方法。

我一直在尝试使用框架提供的Visualizer类,但是很难获得y值的可用结果。返回的字节数组包含-128到127之间的值,但是当我查看实际值时,它们似乎并不像我期望的那样代表波形。

如何使用可视化器返回的值来获取与声音响度有关的值?

最佳答案

您的字节数组可能是16、24或32位有符号值的数组。假设它们是16位带符号的,则字节将交替为高字节,其中MSB为符号位和低字节。或者,取决于字节序,它可以是低字节,后跟高字节。此外,如果您有两个数据通道,则每个样本可能会交错。同样,假设为16位,则可以按类似于以下方式对样本进行解码:

for (int i = 0 ; i < numBytes/2 ; ++i)
{
    sample[i] = (bytes[i*2] << 8) | bytes[i*2+1];
}

根据getMaxAmplitude的文档,它返回自上次调用以来采样的最大绝对振幅。我想这意味着峰值幅度,但是从文档中还不能完全清楚。要计算峰值幅度,只需计算所有样本的绝对值的最大值即可。
int maxPeak = 0.0;
for (int i = 0 ; i < numSamples ; ++i)
{
    maxPeak = max(maxPeak, abs(samples[i]));
}

07-24 19:38