了解Android中的AudioTrack断言

时间:2016-03-14 23:15:29

标签: java android audiotrack

在我的Android应用中,我使用AudioTrack API输出从RFCOMM蓝牙连接收到的音频字节。音频按预期播放,非常清晰。但是,由于AudioTrackShared.cpp中的以下断言,应用程序偶尔会崩溃:

stepCount <= mUnreleased && mUnreleased <= mFrameCount

我不确定这个断言需要什么,但有没有人知道可能导致这个问题的原因?如果需要,我可以提供其他源代码:

我对AudioTrack的设置:

int minSize = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT);
mAudioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT, minSize * 4, AudioTrack.MODE_STREAM);

2 个答案:

答案 0 :(得分:1)

隐藏的错误

该错误audioBuffer大小与minBufferSize没有直接关系。假设这两个必须相同,这是对API的误解,如果不误用的话。 (†)

此明显修正的原因在于,具有相同的大小可确保在audioBuffer期间每次都完整复制mAudioPlayer.write(audioBuffer, 0, audioBuffer.length)

崩溃的实际原因是,audioBuffer大于minBufferSize时,可能没有完整复制,然后在mAudioPlayer.write(audioBuffer, 0, audioBuffer.length)有机会完成之前被丢弃。

解决方案

  • 检查audioBuffer分配和取消分配
  • 在多线程或异步环境中,请确保audioBuffer在分配之间已被消耗。

(†)

  1. AudioTrack缓冲区大小> audioBuffer大小:
    您可能有很多小数据包不定期到达,并可以利用AudioTrack缓冲系统来弥补这些不正常情况

  2. AudioTrack缓冲区大小== audioBuffer大小:
    1对1比赛; mAudioPlayer.write可以保证在返回时将audioBuffer完全复制到AudioTrack缓冲区中

  3. AudioTrack缓冲区大小<audioBuffer大小:
    轨道将根据需要遍历audioBufferaudioBuffer的生命周期可以持续足够长的时间

在所有情况下,audioBuffer必须保持分配状态,直到耗尽为止,并且在数据用完之前向mAudioPlayer.write提供一个 new 缓冲区,以避免播放间隙

答案 1 :(得分:0)

使AudioTrack缓冲区大小与从minBufferSize获得的大小相同。这可以解决你的问题。