我创建了一个简单的应用程序,它生成一个给定频率的方波,并在STREAM模式下使用AudioTrack播放它(STREAM_MUSIC)。一切似乎工作正常,声音播放正常,但是当流完成后,我在日志中收到消息:
W / AudioTrack(7579):gainBuffer()轨道0x14c228禁用,重启......
即使在调用stop()函数后,我仍然会得到这些。 我相信我根据AudioTrack所需的最小尺寸(在我的情况下为6x1024)正确设置了AudioTrack缓冲区大小。我用1024个短裤的较小缓冲区喂它。
我可以得到这些,我应该这样离开吗?
答案 0 :(得分:15)
好的,我认为问题已经解决了。当缓冲区未完全填充数据时(缓冲区欠载),将生成错误。我不知道超时是什么,但如果您遇到这种情况,请确保:
在缓冲区中有一些数据之前,不要调用play方法。
您可以足够快地生成数据以超过超时。
在您使用数据填充缓冲区之后,在调用stop()方法之前,请确保“last”缓冲区在超时之前已完全填充数据。
我通过总是稍等一下(直到超时)然后发送一个充满零的缓冲区并最终调用stop()函数来处理最后一个问题。
请记住,即使您准备好了大块,也必须始终以较小的块发送缓冲区。它仍然困扰我一点,我不是100%肯定,如果这是正确的方式但错误消失所以我想我可以忍受:)
答案 1 :(得分:5)
我发现即使缓冲区在技术上足够长,并且填充了字节,如果格式不正确(音频短路转换为字节数组),它仍会引发错误。
答案 2 :(得分:4)
当我实例化Audiotrack时,我收到了警告,名为audioTrack.play()
,play()
电话和audioTrack.write()
之间有一点延迟。如果我在play()
之前调用write()
警告消失了。
答案 3 :(得分:0)
我已经解决了这个问题
if (mAudioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING)
mAudioTrack.play();
mAudioTrack.write(b, 0, sz * 2);
mAudioTrack.stop();
mAudioTrack.flush();