android - 在 Android AudioTrack 中使用缓冲区

标签 android audiotrack

我想知道如何使用 AudioTrack 的缓冲区有效地播放音乐。我知道您可以使用 write 对音频进行排队方法,但是一旦音频排队,您如何判断剩余多少与已使用/播放了多少?抱歉,如果这是一个基本问题。我理解缓冲区的概念我只是不确定如何编写缓冲区,尤其是使用 AudioTrack。

最佳答案

AudioTrack.write()以 int 形式返回“写入的字节数”,您在构造 AudioTrack 时指定缓冲区中的字节数。

因此,要跟踪剩余的缓冲区空间,您可以保留一个累加器变量,以便您知道总共写入了多少字节,并在调用 AudioTrack.flush() 时将此变量设置为零。 .但是,链接的文档指出“通常使用总大小的 1/2 的 block 来允许双缓冲”,因此它可能很简单,只需记住自调用 flush 以来您是否写过零、一次或两次.

要知道缓冲区已经播放了多少,请使用 AudioTrack.getPlaybackHeadPosition()它返回已播放的当前缓冲区(即在停止、刷新或重新加载时重置为零)作为带符号的 32 位整数 但被解释为无符号 32 位整数。所有这一切实际上意味着您将它分配给一个 int,如下所示。

int bufferPlaybackFrame = myAudioTrack.getPlaybackHeadPosition() & 0xFF;

您可以将帧视为等同于样本。即,您可以从用于构建 AudioTrack 的 AudioFormat 计算出每个样本使用了多少位(以及字节)。

最后,如果有人想知道,您将永远无法知道还有多少源文件或流可以通过此对象播放(原因之一是它设计用于永久 24/7 流,与没有结束),所以如果你想像在一些视频播放网站上看到的那样进行计算,暂停流直到有足够的 id 缓冲以在你当前的下载速率下看到整个视频,你必须在一些中传递该信息另一种方式。

关于android - 在 Android AudioTrack 中使用缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20511144/

相关文章:

android - 在视觉 API 中将 TextBlock 从上到下排序

android - 使用 Mono Touch 时,我还可以为标准 Window 应用程序打包吗?

java - 如何将字符串中的 double 据转换为在 android studio 上的 TextView 上设置

java - 如果在我的 java 文件中使用大量 @SuppressWarnings 会发生什么?

java - 在 Android 中将循环音频与动画精确同步

Android:如何获取当前 Activity 的 Audio Session ID

java - Robolectric 和 SQLite.getVersion

Java VLCJ 播放器,设置音轨不起作用

java - Android 音频编程噩梦 - soundpool,audiotrack arrghh?

Android AudioTrack 不播放所有样本