Java 理解Android中的AudioTrack断言

Java 理解Android中的AudioTrack断言,java,android,audiotrack,Java,Android,Audiotrack,在我的Android应用程序中,我使用AudioTrack API输出从RFCOMM蓝牙连接接收的音频字节。音频按预期播放,非常清晰。但是,由于AudioTrackShared.cpp中的以下断言,应用程序偶尔会崩溃: stepCount <= mUnreleased && mUnreleased <= mFrameCount 使AudioTrack缓冲区大小与您从minBufferSize获得的大小相同。这可以解决您的问题。隐藏的错误 错误与audioBuffer

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

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);