在我的 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);
隐藏的错误
错误是not直接关系到audioBuffer
尺寸对比minBufferSize
。假设这两者必须相同,即使不是误用,也是对 API 的误解。(†)
这种明显修复背后的原因是具有相同的尺寸可以确保audioBuffer
期间被完整复制mAudioPlayer.write(audioBuffer, 0, audioBuffer.length)
,每一次,每一次。
事故发生的真正原因是audioBuffer
,当大于minBufferSize
,可能没有被完整复制,然后被丢弃mAudioPlayer.write(audioBuffer, 0, audioBuffer.length)
有机会完成。
解决方案
- Check
audioBuffer
分配和解除分配
- 在多线程或异步环境中,确保
audioBuffer
已在分配之间被消耗。
(†)
-
AudioTrack
缓冲区大小 >audioBuffer
size:
您可能有许多小包裹不定期到达,可以利用AudioTrack
缓冲系统来补偿这些不规则性
-
AudioTrack
缓冲区大小==audioBuffer
size:
1对1比赛;mAudioPlayer.write
几乎可以保证已复制audioBuffer
完全进入AudioTrack
返回时缓冲
-
AudioTrack
缓冲区大小 audioBuffer size:
该轨道将迭代audioBuffer
如所须 ;audioBuffer
生命周期最好持续足够长的时间
在所有情况下,audioBuffer
必须保持分配直到消耗,并且new缓冲区呈现给mAudioPlayer.write
在数据耗尽之前避免播放间隙。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)