Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在静态模式下使用AudioTrack的正确方法是什么?_Java_Android_Multithreading_Audio - Fatal编程技术网

Java 在静态模式下使用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

我有一个安卓游戏,我需要播放简短的声音。在上崩溃,有高达200毫秒以上的延迟,OpenSL需要SDK 9+(我支持1.5)。就这样离开了

这就是我尝试过的。我创建了这样的AudioTrack对象

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