5

短い音を再生する必要があるAndroidゲームがあります。SoundPoolはデュアルコア電話でクラッシュします。Mediaplayerには最大200ms以上の遅延があり、OpenSLにはSDK 9以降が必要です(私は1.5をサポートしています)。これでAudioTrackが残ります。

これは私が試したことです。このように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);
}

次に、ゲーム内のサウンド(約8)ごとにランナブルを作成します。

private static class SoundRunnable implements Runnable {

    private final AudioTrack sound;
    private final byte[] rawAudio;

    public SoundRunnable(final AudioTrack sound, final byte[] rawAudio){
        this.sound = sound;
        this.rawAudio = rawAudio;
        sound.write(rawAudio, 0, rawAudio.length);
    }

    @Override
    public void run() {
        playSound();
    }

    private synchronized void playSound() {
        switch (sound.getPlayState()) {
        case AudioTrack.PLAYSTATE_PAUSED:
            sound.stop();
            sound.reloadStaticData();
            sound.play();
        break;
        case AudioTrack.PLAYSTATE_PLAYING:
            sound.stop();
            sound.reloadStaticData();
            sound.play();
        break;
        case AudioTrack.PLAYSTATE_STOPPED:
            sound.reloadStaticData();
            sound.play();
        break;
        default:
            break;
        }
    }   

    public synchronized void release() {
        sound.release();
    }

}

次に、サウンドを再生する必要があるときに、それをThreadPoolに送信します。

private void playSound(final int soundToPlay) {
    final SoundRunnable soundRunnable = mediaPlayers.get(soundToPlay);
    if(soundRunnable != null){
        threadPool.execute(soundRunnable);
    }
}

私が抱えている主な問題は、ランナブルを最初に実行したときにサウンドが2回再生されることです。その後、時々私はまだ二重の音を出すかもしれませんが、それはかなりうまくいきます。

また、ストリーミングモードで単一のAudioTrackを作成し、ランナブルから生のオーディオを書き込むことも実験しました。これはやや成功しましたが、いつ再生を停止するかを知るのは困難でした。早めに停止すると、音が短くなり、遅すぎて、getBufferエラーが発生し、アプリがロックされます。また、2つのサウンドを同時に再生することは困難です(AudioTracksのプールを使用する可能性があります)。

オーディオのストリーミングを含まないAudioTrackのサンプルコードを見てみたいです。

4

1 に答える 1

1

私はGoogleの営業時間中にこの質問をしました。彼らは、AudioTrackにはSoundPoolと同じバグがあると言いました。この問題の唯一の解決策は、ネイティブメディアプレーヤーを作成することです。ただし、この問題はGingerbreadを実行しているデュアルコア電話にのみ影響するようです。

于 2012-07-11T21:22:32.020 に答える