AudioTrack阻止功能

时间:2014-07-24 11:58:36

标签: android audiotrack

我对Android AudioTrack功能有一些疑问。我想知道阻塞对AudioTrack的确切作用。

写入函数是否阻塞它正在运行的线程(比如主gui线程),或者只是阻止AudioTrack播放缓冲区?

什么时候应该调用play函数?写缓冲区之后还是之前?现在我调用track.play()一次,然后通过代码写缓冲区而不调用stop。

缓冲区大小是否包含右侧和左侧交错样本,或者它只是意味着两者中的任何一个?比方说,我有8192个样本,我的最小缓冲区系统大小是15000.所以我可以将缓冲区大小定义为8192,还是应该两次?

提前感谢您的回答。

1 个答案:

答案 0 :(得分:0)

如果您使用的是AudioTrack.MODE_STREAM,则需要先调用play,然后再写。对于AudioTrack.MODE_STATIC,您在播放前调用write(如果您想再次播放,则重新加载静态数据,或者使用setlooppoints进行循环)。

就写作期间的阻塞而言,我也遇到了问题。 write会创建一个单独的线程发送给系统音频,但只要你只使用一个音轨实例就不成问题。在你写作时,最好只是开始一个主题。

就缓冲区大小而言,是的,数据包含所有通道,因此如果您使用单声道样本/文件,则样本的长度将除以2.这里我做了一件事获取缓冲区大小,虽然我需要稍后修改它,具体取决于我希望样本播放的速度:

int minBufferSize = AudioTrack.getMinBufferSize(sampleRate,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

你可以将它设置为任何东西,只要它似乎对你来说没问题。当我编码mp3文件/样本时(同样,对于MONO),我不得不用总数组/ 2写入输出PCM数组。