Visualizer的getMaxAmplitude()替代方案

时间:2014-11-04 23:53:24

标签: android audio

在我的应用中,我允许用户使用手机的相机录制音频,在录制过程中我使用时间作为X值更新路径,并使用getMaxAmplitude()的标准化形式更新路径y值。

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

这很有效。

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

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

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

1 个答案:

答案 0 :(得分:0)

您的字节数组可能是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]));
}