【问题标题】:Media Codec dequeueOutputBuffer IllegalStateException媒体编解码器 dequeueOutputBuffer IllegalStateException
【发布时间】:2016-09-21 19:22:53
【问题描述】:

我尝试使用 Android 媒体编解码器解码 mp3 音频数据流。 使用 44100 的采样率,解码工作正常,但延迟太大。所以我将采样率设置为 16000,但现在解码器不再工作了。我在 dequeueOutputBuffer 收到非法状态异常。

这是代码中可能出现问题的部分:

                        bufferInfo = new MediaCodec.BufferInfo();
                        outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, -1);


                        while (outputBufferIndex >= 0) {



                            outputBuffer = decoder.getOutputBuffer(outputBufferIndex);

                            outputBuffer.position(bufferInfo.offset);
                            outputBuffer.limit(bufferInfo.offset + bufferInfo.size);

                            outData = new byte[bufferInfo.size];
                            outputBuffer.get(outData);

                            track.write(outData, 0, outData.length);

                            decoder.releaseOutputBuffer(outputBufferIndex, false);
                            outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, -1);


                        }

我也尝试将 dequeueOutputBuffer 的超时设置为 0,但这并没有改变任何东西。

这是我收到的错误:

E/SoftMP3: mp3 decoder returned error 1
E/ACodec: [OMX.google.mp3.decoder] ERROR(0x80001001)
E/ACodec: signalError(omxError 0x80001001, internalError -2147483648)
E/MediaCodec: Codec reported err 0x80001001, actionCode 0, while in state 6
E/AndroidRuntime: FATAL EXCEPTION: Thread-79054
    Process: com.example.jonas.audio_client, PID: 26394
    java.lang.IllegalStateException
       at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)
       at android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:1107) 

如果我打印提取器获取的音频格式,我会看到采样率设置为 16000。

D/Format:: {bitrate=32000, mime=audio/mpeg, durationUs=6509000, channel-count=1, sample-rate=16000, bit-rate=32000}

感谢您的帮助!

【问题讨论】:

    标签: android mp3 android-mediacodec decoder


    【解决方案1】:

    如果您在模拟器上运行此程序,请确保您已在模拟器设置中选择 Graphics 作为 Hardware : GLES 2.0。软件版本似乎有问题。

    【讨论】:

      【解决方案2】:

      我遇到了与此类似的问题,但使用的是视频编码器。我通过弄乱我的视频的比特率来解决我的问题,直到它起作用。目前,我已经用32 * width * height * frameRate / 100 的比特率解决了我的问题。所以我建议你试着弄乱你的比特率。

      受到this answer 的影响,我得出了这个解决方案。

      【讨论】:

      • 我已经尝试将int bitrate = 450000; 更改为int bitrate = 32*resultHeight*resultWidth*25 / 100;,但它仍然没有工作。我收到this 同样的错误。
      猜你喜欢
      • 2014-06-05
      • 1970-01-01
      • 2014-02-18
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多