【发布时间】:2011-01-26 23:11:19
【问题描述】:
我目前正在使用 AudioTrack 播放录制的音乐。这涉及将轨道数据写入音频缓冲区。我将如何使用音频数据流在屏幕上绘制代表正在实时播放的音频的波形?在我不确定如何开始之前,我没有在 android 上使用过任何高级图形。我必须使用openGL还是可以实现视图?以及如何将数据转换为可用于绘图的数据。
【问题讨论】:
我目前正在使用 AudioTrack 播放录制的音乐。这涉及将轨道数据写入音频缓冲区。我将如何使用音频数据流在屏幕上绘制代表正在实时播放的音频的波形?在我不确定如何开始之前,我没有在 android 上使用过任何高级图形。我必须使用openGL还是可以实现视图?以及如何将数据转换为可用于绘图的数据。
【问题讨论】:
您的第一步是致电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
}
【讨论】:
关于这一点,我建议您使用处理波形数组或频率数组生成的android.media.audiofx.Visualizer 类。所以你唯一需要注意的是图形的绘制。
您可以在 API 9 发布后使用此类。
【讨论】: