我对Android的AudioTrack功能有一些疑问。我想知道阻塞对AudioTrack到底起到了什么作用。
是写函数阻塞了它正在运行的线程(例如主gui线程),还是它只是阻止AudioTrack播放缓冲区?。
什么时候应该调用play函数?在写缓冲区之后还是在它之前?现在我只调用track.play()一次,然后通过代码编写缓冲区,而不调用.。
缓冲区大小是否包括左右交错的示例,还是仅表示这两个示例中的任何一个?比如说,我有8192个样本,我的最小缓冲系统大小是15000。那么,我可以将缓冲区大小定义为8192,还是应该是两倍呢?
提前谢谢你的回答。
发布于 2017-01-17 06:00:19
如果您使用的是AudioTrack.MODE_STREAM,您需要首先调用play,然后编写。对于AudioTrack.MODE_STATIC,您可以在播放前调用write (如果您想要再次播放,则重新加载静态数据,或者设置循环的环点)。
至于在编写过程中阻塞,我也遇到了一个问题。写将创建一个单独的线程发送到系统音频,但只要您只是使用一个音频轨道实例应该不会是一个问题。也许在你写作的时候,最好先开门见山。
就缓冲区大小而言,是的,数据包含所有通道,因此,如果您使用的是单一样本/文件,那么样本的长度将被除以2。下面是我为获得缓冲区大小所做的一件事,不过我需要稍后修改它,这取决于我希望示例播放的速度:
int minBufferSize = AudioTrack.getMinBufferSize(sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);你可能可以把它设置成任何东西,只要它看起来对你来说还行。当我对mp3文件/sample进行编码时(同样,对于MONO),我必须用整个数组/2写入输出PCM数组。
https://stackoverflow.com/questions/24933064
复制相似问题