在我的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);
答案 0 :(得分:1)
该错误不与audioBuffer
大小与minBufferSize
没有直接关系。假设这两个必须相同,这是对API的误解,如果不误用的话。 (†)
此明显修正的原因在于,具有相同的大小可确保在audioBuffer
期间每次都完整复制mAudioPlayer.write(audioBuffer, 0, audioBuffer.length)
。
崩溃的实际原因是,audioBuffer
大于minBufferSize
时,可能没有完整复制,然后在mAudioPlayer.write(audioBuffer, 0, audioBuffer.length)
有机会完成之前被丢弃。
audioBuffer
分配和取消分配audioBuffer
在分配之间已被消耗。(†)
AudioTrack
缓冲区大小> audioBuffer
大小:
您可能有很多小数据包不定期到达,并可以利用AudioTrack
缓冲系统来弥补这些不正常情况
AudioTrack
缓冲区大小== audioBuffer
大小:
1对1比赛; mAudioPlayer.write
可以保证在返回时将audioBuffer
完全复制到AudioTrack
缓冲区中
AudioTrack
缓冲区大小<audioBuffer
大小:
轨道将根据需要遍历audioBuffer
; audioBuffer
的生命周期可以持续足够长的时间
在所有情况下,audioBuffer
必须保持分配状态,直到耗尽为止,并且在数据用完之前向mAudioPlayer.write
提供一个 new 缓冲区,以避免播放间隙
答案 1 :(得分:0)
使AudioTrack缓冲区大小与从minBufferSize获得的大小相同。这可以解决你的问题。