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

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

【问题讨论】:

    标签: java android graphics


    【解决方案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 的值。如何计算?在我的情况下应该是什么...stackoverflow.com/questions/9413998/…
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多