从 ByteStream 可视化 Android AudioTrack

Posted

技术标签:

【中文标题】从 ByteStream 可视化 Android AudioTrack【英文标题】:Visualising Android AudioTrack from a ByteStream 【发布时间】:2011-01-26 23:11:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您的第一步是致电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

【讨论】:

谢谢,这应该让我开始并朝着正确的方向前进。然后我只需要担心这将如何处理多个流。 是的,这将大大增加您的难度。我建议您自己将所有内容预先混合到一个流中,但这对于您正在做的事情可能是不可能的。 我实际上计划运行 4 个带有可视化的音轨,并且延迟将在录制音频时发挥重要作用。谁知道结果会如何,但这只是一个开始。如果它太慢,我可能不得不迁移到 NDK 2.3。 @MusiGenesis +1 不错的答案...您如何找到 2205 的值。如何计算?在我的情况下应该是什么...***.com/questions/9413998/…【参考方案2】:

关于这一点,我建议您使用处理波形数组或频率数组生成的android.media.audiofx.Visualizer 类。所以你唯一需要注意的是图形的绘制。

您可以在 API 9 发布后使用此类。

【讨论】:

以上是关于从 ByteStream 可视化 Android AudioTrack的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow入门MNIST遇到的问题

从android客户端通过套接字发送后收到黑色图像

从“无符号”字节流中读取 32 位有符号值

Android Module依赖关系的可视化实现

Android获取窗口可视区域大小: getWindowVisibleDisplayFrame()

Android 可视化走迷宫算法 支持自定义地图