【问题标题】:End of playback detection in AudioTrack is not workingAudioTrack 中的播放结束检测不起作用
【发布时间】:2014-12-22 12:11:22
【问题描述】:

这是我正在使用的代码:

void playSound(){
    final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            sampleRate, AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
            AudioTrack.MODE_STATIC);
    // audioTrack.setNotificationMarkerPosition(generatedSnd.length/2);
    audioTrack.setNotificationMarkerPosition(1);
    audioTrack.setPlaybackPositionUpdateListener(new AudioTrack.OnPlaybackPositionUpdateListener() {
        @Override
        public void onPeriodicNotification(AudioTrack track) {
            // nothing to do
        }

        @Override
        public void onMarkerReached(AudioTrack track) {
            // Log.d(LOG_TAG, "Audio track end of file reached...");
            // messageHandler.sendMessage(messageHandler.obtainMessage(PLAYBACK_END_REACHED));
            Log.d("MY LOG", "Audio track end of file reached...");
            bitPatternValTextView.setText("End of play");
        }
    });
    audioTrack.write(generatedSnd, 0, generatedSnd.length);
    audioTrack.play();
}  

playSound() 函数在内部定义

公共类 InSituActivity 扩展 ActionBarActivity{...}

我的假设是,当 AudioTrack 的播放到达第 N 个音频样本(每个 N 是一个短字节或 2 个字节)时,audioTrack.setNotificationMarkerPosition(N); 将导致 onMarkerReached(AudioTrack track) 被调用。但是,如我的示例代码所示,我尝试了generatedSnd.length/2(generatedSnd[] 是一个包含我要播放的音频样本的字节数组)以及使用小的常量值,例如 1、10 或 20,以及 @987654329在任何这些情况下,@ 似乎都不会被调用。这里有什么问题,我该如何解决?我希望能够在当前 AudioTrack 完成播放时播放另一种声音。 playSound() 函数本身将在一个线程中调用(与 UI 线程分开)。

这是我从以下位置获取代码的地方:
How to tell when AudioTrack object has finished playing?

其他参考:
AudioTrack: how to detect end of sound?
Confusion about Thread life and AudioTrack in android java

【问题讨论】:

  • 您应该使用 setNotificationMarkerPosition 而不是 1 的帧数中的文件长度。顺便说一句,它应该是很大的数字。
  • 1 只是一个测试编号,如果它正在工作,我应该在 logcat 中看到一些通知
  • 如果您使用单独的线程,请尝试 MODE_STREAM,并循环输入 AudioTrack 直到数据结束
  • 好吧,这似乎可行,但为什么它不适用于静态?
  • 提要音轨是什么意思?我在 generatedSnd 数组中有我需要生成的所有音频样本,我认为将所有内容都播放为静态会更好

标签: java android audio audiotrack


【解决方案1】:

回答可能为时已晚,但这对我有用。我也没有得到 onMarkerReached() 回调。 我只是大量增加了静态流的大小。可能不适用于 MODE_STREAM 或不同的缓冲区大小。适用于我需要的所有缓冲区大小,对于我的用例来说最多只有 10 秒。 尝试在代码中更改这一行,看看会发生什么:

int magic_number = 1000; // try with different values. Maybe make it 10% of generatedSnd.length?
final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
        sampleRate, AudioFormat.CHANNEL_OUT_MONO,
        AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
        AudioTrack.MODE_STATIC + magic_number);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多