为什么我不能使用 AudioTrack 的静态模式播放原始音频字节?

Why Can't I Play Raw Audio Bytes Using AudioTrack's Static Mode?

我有一个 Android 应用程序,其中有一些原始音频字节存储在一个变量中。

如果我使用 AudioTrack 播放此音频数据,它仅在我使用 AudioTrack.MODE_STREAM:

时有效
byte[] recordedAudioAsBytes;

public void playButtonPressed(View v) {

        // this verifies that audio data exists as expected
        for (int i=0; i<recordedAudioAsBytes.length; i++) {
            Log.i("ABC", "byte[" + i + "] = " + recordedAudioAsBytes[i]);
        }

        // STREAM MODE ACTUALLY WORKS!!
        /*
        AudioTrack player = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLERATE, CHANNELS,
                ENCODING, MY_CHOSEN_BUFFER_SIZE, AudioTrack.MODE_STREAM);
        player.play();
        player.write(recordedAudioAsBytes, 0, recordedAudioAsBytes.length);
         */


        // STATIC MODE DOES NOT WORK

        AudioTrack player = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLERATE, PLAYBACK_CHANNELS,
                ENCODING, MY_CHOSEN_BUFFER_SIZE, AudioTrack.MODE_STATIC);
        player.write(recordedAudioAsBytes, 0, recordedAudioAsBytes.length);
        player.play();
    }

如果我使用 AudioTrack.MODE_STATIC,输出会出现故障——它只会发出令人讨厌的爆破声,而且声音非常短,几乎听不见任何声音。

那是为什么呢? STATIC_MODE 是否要求音频数据具有 header?

我能想到的就这些了

如果您想查看所有代码,请选中 this question

在我看来,您对 'streaming' 和 'static' 模式使用相同的 MY_CHOSEN_BUFFER_SIZE!?这或许可以解释为什么它听起来很短...

为了使用 Audiotracks 'static-mode',您必须使用字节数组的大小(更大的也可以)作为缓冲区大小。音频将被视为一大块数据。

参见:AudioTrack.Builder

setBufferSizeInBytes()... "If using the AudioTrack in static mode (see AudioTrack#MODE_STATIC), this is the maximum size of the sound that will be played by this instance."