Java 理解Android中的AudioTrack断言
在我的Android应用程序中,我使用AudioTrack API输出从RFCOMM蓝牙连接接收的音频字节。音频按预期播放,非常清晰。但是,由于AudioTrackShared.cpp中的以下断言,应用程序偶尔会崩溃:Java 理解Android中的AudioTrack断言,java,android,audiotrack,Java,Android,Audiotrack,在我的Android应用程序中,我使用AudioTrack API输出从RFCOMM蓝牙连接接收的音频字节。音频按预期播放,非常清晰。但是,由于AudioTrackShared.cpp中的以下断言,应用程序偶尔会崩溃: stepCount <= mUnreleased && mUnreleased <= mFrameCount 使AudioTrack缓冲区大小与您从minBufferSize获得的大小相同。这可以解决您的问题。隐藏的错误 错误与audioBuffer
stepCount <= mUnreleased && mUnreleased <= mFrameCount
使AudioTrack缓冲区大小与您从minBufferSize获得的大小相同。这可以解决您的问题。隐藏的错误 错误与
audioBuffer
大小与minBufferSize
之间没有直接关系。假设这两者必须相同,即使不是误用,也是对API的误解(†)
这种明显的修复方法背后的原因是,具有相同的大小可以确保在mAudioPlayer.write(audioBuffer,0,audioBuffer.length)
期间每次都完整复制audioBuffer
崩溃的实际原因是audioBuffer
大于minBufferSize
时,可能没有完整复制,然后在mAudioPlayer.write(audioBuffer,0,audioBuffer.length)
有机会完成之前丢弃
解决
- 检查
分配和解除分配audioBuffer
- 在多线程或异步环境中,确保
已在分配之间使用audioBuffer
AudioTrack
buffer size>audioBuffer
size:您可能有许多小数据包不规则地到达,可以利用
AudioTrack
缓冲系统来补偿这些不规则
AudioTrack
buffer size==audioBuffer
size:1比1比赛
mAudioPlayer.write
几乎可以保证在返回时将audioBuffer
准确复制到AudioTrack
缓冲区
AudioTrack
buffer sizeaudioBuffersize:该曲目将根据需要在
音频缓冲区
中循环播放<代码>音频缓冲区寿命周期更长
在所有情况下,
audioBuffer
必须保持分配状态,直到消耗完为止,还有一个新的缓冲区提供给mAudioPlayer。在数据耗尽之前写入
,以避免播放过程中出现间隙。是否重复使用写入AudioTrack的缓冲区?@mimogrottoli每次写入AudioTrack时,我都会创建一个大小为64的新数组。这是从AudioTrach.getMinBufferSize获得的值吗?不是,但我不明白为什么这会引起问题?我相信你是在用很少的字节输入音轨,但这是一个假设。您在制作音轨时是否尝试过使用just minSize而不是minSize*4?
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);