使用Android AudioTrack的缓冲区

Wil*_*ann 11 android audiotrack

我想弄清楚如何使用AudioTrack的缓冲区来有效地传输音乐.我知道你可以使用write方法对音频进行排队,但是一旦音频排队,你怎么知道剩下多少以及使用/播放了多少?对不起,如果这是一个基本问题.我理解缓冲区的概念我不知道怎么写一个,特别是使用AudioTrack.

And*_*tin 16

AudioTrack.write()返回"写入的字节数"作为int,并指定构造AudioTrack时缓冲区中的字节数.

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

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

int bufferPlaybackFrame = myAudioTrack.getPlaybackHeadPosition() & 0xFF;
Run Code Online (Sandbox Code Playgroud)

您可以将帧视为与样本等效.即你可以从用于构造AudioTrack的AudioFormat中找出每个样本使用多少位(以及字节).

最后,如果有人想知道,你永远无法分辨出通过这个对象剩下多少源文件或流(一个原因是它被设计为使用永久的24/7流,没有结束) ,所以如果你想在一些视频播放网站上进行计算,那么暂停流直到足够的id缓冲以按当前下载速率查看整个视频,你必须以其他方式传递这些信息.