我对Android AudioTrack功能有一些疑问。我想知道阻塞对AudioTrack的确切作用。
写入函数是否阻塞它正在运行的线程(比如主gui线程),或者只是阻止AudioTrack播放缓冲区?
什么时候应该调用play函数?写缓冲区之后还是之前?现在我调用track.play()一次,然后通过代码写缓冲区而不调用stop。
缓冲区大小是否包含右侧和左侧交错样本,或者它只是意味着两者中的任何一个?比方说,我有8192个样本,我的最小缓冲区系统大小是15000.所以我可以将缓冲区大小定义为8192,还是应该两次?
提前感谢您的回答。
答案 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数组。