如何在Android中录制音频时进行可视化处理

14

我知道在 Android Media Player 播放音频时可以使用 Visualizer 显示一些波形。

但是我想在录制音频时显示 Visualizer,也就是说,在录制过程中,我想显示根据用户语音节奏变化的线性波形。

这在 Android 上可行吗?


仅需要一个电平计吗,还是需要每个频率的电平? - elgui
我需要至少一些节拍值,才能使用图形 API 自己绘制图表。 - koti
以时间递增的间隔绘制记录的字节。请参考下面的答案。 - everlasto
3个回答

19

通过每 x 毫秒调用您的 MediaRecorder.getMaxAmplitude(), (从官方文档):

自上次调用此方法以来采样的最大绝对振幅。

然后,您可以实时处理此值以绘制图形或更改某些视图属性。
不完美,但希望对您有所帮助 =)

编辑:知道了这一点,检索到的值在所有 Android 设备上都相同:在 0 和 32767 之间。(当用户吹麦克风时,我收到了超过 10k 的报告给出了这个数值)。


需要指定输出文件,可以跳过吗? - Shashank Kumar
不行,只需像这样给录音机一个: File cacheDir = getWritableCacheDir(); samplePath = cacheDir.getAbsolutePath() + "/sample"; mRecorder.setOutputFile(samplePath);完成后删除它... - elgui
@ShashankKumar:或者使用AudioRecorder。(不需要文件) - njzk2
如何使用Visualizer类中的此方法?您能详细解释一下吗?或者您可以提供任何可以展示所有这些功能的示例代码吗? - Sahil Garg

3

两个重要的事情:

  • 您需要将实时音频数据(来自麦克风)转换为数字值,以便绘制它们。
  • 由于您使用实时图表,因此要绘制这些点,请使用SurfaceView。

    将录制的音频字节转换为数字值 参考: Android:如果发生任何声音,则使用监听器记录声音 在其中您将看到变量“temp”保存了您的音频的数值。

    绘制点 这些表示您Y值的数字值会随着时间间隔的增加(0、1、2..)作为图表的X坐标轴进行绘制。使用SurfaceView 例如..,

//canvas.drawLine(previous X value,previous Y value,X,Y, paint);
canvas.drawPoint(X,Y,paint);
SurfaceHolder.unlockCanvasAndPost(canvas);
你不需要绘制所有的值,为了效率,你可以使用条件过滤这些值,然后绘制一定时间间隔内的数据。
希望这有所帮助 :)

3
你可能需要使用AudioRecorder类来替代MediaRecorder。
请查看AudioRecorder#read(...)方法,该方法将音频数据放入byte[]而不是直接放入文件中。
要在图表上显示更改,您需要分析数据(该数据以PCM 8或16位编码 - link),并实时更新图表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接