gpt4 book ai didi

Android AudioTrack 流提前中断

转载 作者:行者123 更新时间:2023-12-02 22:57:24 26 4
gpt4 key购买 nike

我正在尝试在 Android 中播放一些循环声音,这对我来说效果很好。不过,所有美好的事情都必须结束,我希望这包括我的音频循环。但是,如果我调用 AudioTrack.release()在这个循环之后,正如我应该的那样,我的音频流的结尾被切断了——我知道我应该听到额外的数据,但不要。

我已经通过在发布前放入 Thread.sleep(2000) 来验证这一点 - 声音在那里正确播放。我的代码看起来像这样:

// Initialize Audiotrack
int minBufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 2 * minBufferSize, AudioTrack.MODE_STREAM);

mAudioTrack.play();

// Play looping sound
while (stuff) {
mAudioTrack.write(stuff);
}

// Play one last bit of sound before returning
mAudioTrack.write(lastSound);

// Block until the AudioTrack has played everything we've given it
Thread.sleep(2000);

// Get rid of the Audiotrack
mAudioTrack.release();

我想我可以把 Thread.sleep(2000) 留在那儿,然后收工,但这对我来说听起来很困惑和不负责任。我想要一个 while()循环 block 最合适的时间,或使用 AudioTrack.setPlaybackPositionUpdateListener()并把 release()在那里。

如果我走第一条路线,我需要一些东西来等待, AudioTrack.getPlayState()似乎总是将轨道报告为正在播放。所以我被困在那里。

如果我走第二条路线,我需要一种方法来获取最后写入的 AudioTrack 缓冲区中的位置,这样我就可以告诉 AudioTrack 我正在等待它播放到哪个位置。不过,我对如何获取这些信息没有任何想法。

我想我真的不在乎我用哪种方式做,所以任何帮助以一种或另一种方式解决问题的帮助将不胜感激。

最佳答案

该问题与 AudioTrack 中的缓冲区大小有关。

想象一下 minBufferSize是8k。这意味着 AudioTrack 将在缓冲区已满时播放声音。

mAudioTrack.write(stuff);

如果 stuff只有 4K,AudioTrack 将等到下一次调用 write直到它有足够的数据播放。

结论 :您需要跟踪您写入的数据量,并在播放结束时向 AudioTrack 提供一些虚拟字节以完成 minBufferSize .为了让事情变得更容易,你可以喂整个 minBufferSize静音字节的数量。

顺便说一句,要喂虚拟或静音只需用零填充数据。

关于Android AudioTrack 流提前中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22058290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com