16

我创建了一个简单的应用程序,它生成一个给定频率的方波,并在 STREAM 模式 (STREAM_MUSIC) 下使用 AudioTrack 播放它。一切似乎工作正常,声音播放正常,但是当流完成时,我在日志中收到消息:

W/AudioTrack(7579):获取缓冲区()轨道 0x14c228 已禁用,正在重新启动...

即使在调用 stop() 函数后,我仍然得到这些。我相信我根据 AudioTrack 所需的最小大小(在我的情况下为 6x1024)正确设置了 AudioTrack 缓冲区大小。我用较小的 1024 短裤缓冲区喂它。

我得到这些可以吗?我应该这样吗?

4

4 回答 4

15

好的,我认为问题解决了。当缓冲区未按时完全填满数据(缓冲区欠载)时,将生成错误。我不知道超时是什么,但如果您遇到这种情况,请确保:

  1. 在缓冲区中有一些数据之前,您不会调用 play 方法。

  2. 您可以以足够快的速度生成数据以超过超时。

  3. 完成向缓冲区提供数据后,在调用 stop() 方法之前,请确保“最后一个”缓冲区在超时之前已完全填满数据。

我通过总是等待一点(直到超时)然后发送 1 个充满零的缓冲区并最后调用 stop() 函数来处理最后一个问题。

请记住,您必须始终以较小的块发送缓冲区,即使您已准备好大块。它仍然让我有点困扰,我不是 100% 确定这是否是正确的方法,但错误已经消失了,所以我想我可以忍受 :)

于 2011-12-10T04:21:50.667 回答
5

我发现即使缓冲区在技术上足够长并且充满了字节,如果它们的格式不正确(音频短片转换为字节数组),它仍然会抛出该错误。

于 2012-04-02T20:59:19.630 回答
4

当我实例化 Audiotrack 时,我收到了这个警告,调用audioTrack.play()并且play()调用和audioTrack.write(). 如果我在警告消失play()之前打电话。write()

于 2012-11-27T14:38:40.923 回答
0

我已经解决了这个

        if (mAudioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING)
            mAudioTrack.play();
        mAudioTrack.write(b, 0, sz * 2);
        mAudioTrack.stop();
        mAudioTrack.flush();
于 2015-10-17T14:03:22.837 回答