【问题标题】:Why Can't I Play Raw Audio Bytes Using AudioTrack's Static Mode?为什么我不能使用 AudioTrack 的静态模式播放原始音频字节?
【发布时间】:2021-11-16 21:26:18
【问题描述】:

我有一个 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 是否要求音频数据有标头?

我能想到的就这些了。

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

【问题讨论】:

    标签: android audio encoding pcm audiotrack


    【解决方案1】:

    在我看来,您对“流式传输”和“静态”模式使用相同的 MY_CHOSEN_BUFFER_SIZE!?这或许可以解释为什么它听起来很短……

    为了使用音轨“静态模式”,您必须使用字节数组的大小(更大也可以)作为缓冲区大小。音频将被视为一大块数据。

    见:AudioTrack.Builder

    setBufferSizeInBytes()... "如果在静态模式下使用 AudioTrack(参见 AudioTrack#MODE_STATIC),这是该实例将播放的声音的最大尺寸。"

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2012-08-29
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2015-05-01
      相关资源
      最近更新 更多