我目前正在使用AudioTrack播放录制的音乐。这涉及将轨道数据写入音频缓冲区。我如何使用音频数据流在屏幕上绘制一个表示实时播放音频的波形?在我不确定如何开始之前,我没有在Android上使用任何高级图形。我必须使用openGL还是可以实现View?以及如何将数据转换为可用于绘图的内容。
答案 0 :(得分:3)
您的第一步是致电setPositionNotificationPeriod(periodInFrames)
。这决定了您的应用程序接收onPeriodicNotification
电话的频率。因此,如果您正在进行示波器类型的可视化,并且您希望在任何给定时刻在屏幕上显示50毫秒的音频数据,那么您将使用periodInFrames
值2205(假设您的WAV文件是单声道,每个样本16位,采样率为44,100 Hz。
在通知事件中,您可以确定当前正在播放AudioTrack对象的位置,然后从原始文件或阵列中获取相应的数据片段。然后,您可以使用普通的2D图形方法将这片数据绘制到视图中(此处不需要openGL)。 This answer有一个C#示例用于绘制一段音频数据 - 很容易转换为java。
所以你的代码看起来有点像这样:
audioTrack.setPositionNotificationPeriod(2205);
audioTrack.setPlaybackPositionUpdateListener(this);
...
public void onPeriodicNotification(AudioTrack track) {
int pos = track.getNotificationMarkerPosition();
short[] slice = Array.copy(_data, pos, _sliceSize) // pseudo-code
// render the slice to the view
}
答案 1 :(得分:2)
关于这一点,我建议您使用android.media.audiofx.Visualizer
类来处理波形阵列或频率数组的生成。因此,您唯一需要注意的是绘制图形。
自API 9发布以来,您可以使用此类。