【问题标题】:Android's AudioTrack MODE_STATIC replay issuesAndroid 的 AudioTrack MODE_STATIC 重放问题
【发布时间】:2012-09-17 03:33:24
【问题描述】:

我在使用 AudioTrack 时遇到了问题,这个 Android API 让我很受不了。我以前没有 Android 或 Java 经验,但我是一个非常有经验的编码器(许多平台上的 asm、C++ 等),我从没想过我特别笨,就像 Android 肯定让我现在感觉。

我做错了什么?显然没有:

audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minbufsizbytes*64, AudioTrack.MODE_STATIC);
audioTrack.write(Buffer, 0, numSamples);
audioTrack.play();

实际上 sampleRate=8000 和 minbufsizbytes=742,其中 (742*64 = 47488) 比我正在写的 Buffer(16000 个 16 位样本)大得多。

音频第一次播放就很好。但是……我怎么玩不止一次? (例如响应事件,例如按下钢琴键)。如果我再次调用 play(),将不会产生新的声音。因此,经过几天的挫折,这就是我想出的:

for (i=0;;i++) {
   SystemClock.sleep(3000L); // so the problem is NOT "fast, repeated attempts to replay sound", but looks like internal buffer overrun related (please see the Log'ed error below)
   audioTrack.stop();
   audioTrack.reloadStaticData();
   audioTrack.setPlaybackHeadPosition(0);
   audioTrack.play();
}

所以它第二次或(!)第三次播放声音......然后没有音频!并且日志被此错误消息淹没:

05-18 13:03:16.785: ERROR/AudioFlinger(345): TrackBase::getBuffer buffer out of range:
05-18 13:03:16.785: ERROR/AudioFlinger(345):     start: 0x404fb680, end 0x404fb7f2 , mBuffer 0x40507000 mBufferEnd 0x40512980
05-18 13:03:16.785: ERROR/AudioFlinger(345):                     server 0, serverBase 23744, user 47488, userBase 47488, channels 1

然后我必须重启手机(模拟的或真实的)否则日志洪水不会停止..

(错误)在我的 Galaxy 2.2.1、我的 IDEOS 2.1 和模拟器(各种版本)上表现...所以这不是手机错误问题。

如果我让内部缓冲区更大(AudioTrack 中的第 5 个参数),它会在停止发出声音并开始淹没 Log 之前播放更多次,所以我认为这就像内部缓冲区被溢出

P.S.:你知道 getMinBufferSize 是返回样本还是字节(即使是 PCM_16BIT),正如一些人所报告的那样?

【问题讨论】:

    标签: java android audio


    【解决方案1】:

    这是一个运行了多次的代码示例!! 'super' 是一个 AudioTrack

    公共无效播放(){

        switch (super.getPlayState()) {
        case AudioTrack.PLAYSTATE_PAUSED:
        super.stop();
            super.reloadStaticData();
            super.play();
            break;
        case AudioTrack.PLAYSTATE_PLAYING:
        super.stop();
            super.reloadStaticData();
            super.play();
            break;
        case AudioTrack.PLAYSTATE_STOPPED:
            super.reloadStaticData();
            super.play();
            break;
        }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多