从ByteStream可视化Android AudioTrack

时间:2011-01-26 23:11:20

标签: java android graphics

我目前正在使用AudioTrack播放录制的音乐。这涉及将轨道数据写入音频缓冲区。我如何使用音频数据流在屏幕上绘制一个表示实时播放音频的波形?在我不确定如何开始之前,我没有在Android上使用任何高级图形。我必须使用openGL还是可以实现View?以及如何将数据转换为可用于绘图的内容。

2 个答案:

答案 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发布以来,您可以使用此类。