我目前正在使用AudioTrack播放录制的音乐。这包括将轨道数据写入音频缓冲器。如何使用音频数据流在屏幕上绘制代表正在实时播放的音频的波形?在我不确定如何开始之前,我没有在android上使用过任何高级图形。我必须使用openGL吗?或者我可以实现视图吗?以及如何将数据转换为可用于绘图的有用数据。
发布于 2011-01-27 07:39:02
第一步是调用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
}发布于 2012-03-12 20:40:16
关于这一点,我建议您使用android.media.audiofx.Visualizer类来处理波形数组或频率数组的生成。所以你唯一需要注意的就是图形的绘制。
从API 9发布起,您就可以使用这个类。
https://stackoverflow.com/questions/4811211
复制相似问题