AudioTrack即使在停止后也会重新启动

时间:2011-12-06 05:24:55

标签: android streaming audiotrack

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

W / AudioTrack(7579):gainBuffer()轨道0x14c228禁用,重启......

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

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

4 个答案:

答案 0 :(得分:15)

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

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

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

  3. 在您使用数据填充缓冲区之后,在调用stop()方法之前,请确保“last”缓冲区在超时之前已完全填充数据。

  4. 我通过总是稍等一下(直到超时)然后发送一个充满零的缓冲区并最终调用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();