gpt4 book ai didi

Android:AudioTrack 与多线程

转载 作者:行者123 更新时间:2023-11-29 21:58:41 29 4
gpt4 key购买 nike

我遇到了一个问题,我想在静态模式下反复播放半秒长的 AudioTrack,但声音断断续续。但是,我注意到当 TransitionDrawable 并行运行时,声音非常清晰。

我的代码的简化框架是:

thread = new Thread(new Runnable() {

public void run() {
createTransition();

try {
createAudioTrack();

while (true) {
if (audio) {
playSoundClip();
}

if (display) {
playScreenTransition();
}

Thread.sleep(getDelayBetweenBeats());
}
} catch (InterruptedException e) {
} finally {
resetScreenTransition();
stopSoundClip();
}
}

private void createAudioTrack() {
short[] samples = generateSamples();
track = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLERATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, samples.length * 2, AudioTrack.MODE_STATIC);
if (track.getState() != AudioTrack.STATE_UNINITIALIZED) {
track.write(samples, 0, samples.length);
}
}

private void playSoundClip() {
if (track != null && track.getState() != AudioTrack.STATE_UNINITIALIZED) {
track.stop();
track.reloadStaticData();
track.play();
}
}

private void playScreenTransition() {
view.post(new Runnable() {

public void run() {
view.setBackgroundDrawable(transition);
transition.startTransition(DURATION);
}

});
}

});
thread.start();

如您所见,thread 未在 UI 线程上执行,因此我假设 track 面临多线程问题。我不认为播放过渡的 UI 线程会占用整个 CPU,因为我的音频是并行播放的。似乎该 Activity 以某种方式消耗了 CPU 而没有执行任何其他操作。

我也曾尝试在 playSoundClip() 中使用 view.post(new Runnable() {...});,但这没有帮助.

我考虑过将所有更改为 AsyncTask,但恕我直言,这不会更改任何内容,因为它仍然是后台任务。因为我不需要用声音更新 UI 元素,而且转换仍然必须并行播放,所以我什至没有尝试过。

一个解决方案可能是始终并行运行一些过渡(实际的或虚拟的),但这对我来说听起来很糟糕(双关语?)。

有谁知道另一种方法可以让 track 始终清晰播放?


编辑:
在这个问题上做了更多工作并扩展了我的程序后,我注意到我必须使用上面列出的线程方法,因为其中的逻辑需要一些时间才能完成,而且我无法在 UI 线程上完成所有操作更多的。目前,我在播放音频时播放虚拟过渡,这对我来说听起来仍然很糟糕。因此,如果您仍然可以对这个主题贡献一些见解,欢迎您在此处发布/回答。

最佳答案

您可能想看看 SoundPool,它可以让您将短音频样本静态加载到内存中一次,然后以更低的延迟按需播放。您使用 AudioTrack 的方式可以很好地重播音频而无需重新加载,但对于如此短且经常重复的声音字节来说,它可能仍然有点笨重。

您也可以考虑完全不使用后台线程。从您的代码 fragment 看来,您实际上只是将 Thread 用作计时器,使用 Handler 发布您的 Runnable< 可能会获得更好的性能 在一个定时间隔(这也将允许您在主线程上调用您的音频/转换方法)。

HTH

关于Android:AudioTrack 与多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12520680/

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