Java 在静态模式下使用AudioTrack的正确方法是什么?
我有一个安卓游戏,我需要播放简短的声音。在上崩溃,有高达200毫秒以上的延迟,OpenSL需要SDK 9+(我支持1.5)。就这样离开了 这就是我尝试过的。我创建了这样的AudioTrack对象Java 在静态模式下使用AudioTrack的正确方法是什么?,java,android,multithreading,audio,Java,Android,Multithreading,Audio,我有一个安卓游戏,我需要播放简短的声音。在上崩溃,有高达200毫秒以上的延迟,OpenSL需要SDK 9+(我支持1.5)。就这样离开了 这就是我尝试过的。我创建了这样的AudioTrack对象 protected AudioTrack createAudioTrack() { final int trackSize = 17408; return new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANN
protected AudioTrack createAudioTrack() {
final int trackSize = 17408;
return new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, trackSize, AudioTrack.MODE_STATIC);
}
然后我为游戏中的每个声音创建一个runnable(大约8)
然后,当我需要播放声音时,我会将其发送到线程池
private void playSound(final int soundToPlay) {
final SoundRunnable soundRunnable = mediaPlayers.get(soundToPlay);
if(soundRunnable != null){
threadPool.execute(soundRunnable);
}
}
我遇到的主要问题是,在我第一次执行runnable时,声音会播放两次。之后每隔一段时间我仍然可能会听到双重声音,但效果相当不错
我还尝试过在流媒体模式下创建单个音频曲目,并从runnables中编写原始音频。这是有点成功,但很难知道何时停止播放。如果你早点停下来,声音就会被打断,太晚了,你会收到一个获取缓冲区错误,应用程序会被锁定。同时播放两种声音也很困难(可能会使用一组音频曲目)
我很想看到不涉及流媒体音频的AudioTrack示例代码。我在谷歌办公时间问过这个问题。他们说音轨和原声池有相同的缺陷。这个问题的唯一解决方案是编写本机媒体播放器。尽管如此,这个问题似乎只影响到运行姜饼的双核手机
private void playSound(final int soundToPlay) {
final SoundRunnable soundRunnable = mediaPlayers.get(soundToPlay);
if(soundRunnable != null){
threadPool.execute(soundRunnable);
}
}