【问题标题】:MediaCodec IllegalArgumentExceptionMediaCodec IllegalArgumentException
【发布时间】:2017-09-18 02:30:49
【问题描述】:

我在使用 MediaCodec 解码 mp3 文件时遇到问题。 Logcat 说问题出在 codec.queueInputBuffer(inputBufferId, 0, data.length, 0, 0) 行上,但对我来说它看起来很公平。

代码:

 if(Build.VERSION.SDK_INT >= 21 ) {

        try {
            codec = MediaCodec.createDecoderByType("audio/mpeg");
        } catch (IOException e) {
            e.printStackTrace();
        }

        codec.setCallback(new MediaCodec.Callback() {

            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {
                ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);

                inputBuffer.wrap(data);
                codec.queueInputBuffer(inputBufferId, 0, data.length, 0, 0);  // java.lang.IllegalArgumentException

            }
        }
 }

日志猫:

FATAL EXCEPTION: main
Process: pl.test.projectx, PID: 18252

java.lang.IllegalArgumentException

at android.media.MediaCodec.native_queueInputBuffer(Native Method)

at android.media.MediaCodec.queueInputBuffer(MediaCodec.java:2334)

at pl.test.projectx.Decoder$2.onInputBufferAvailable(Decoder.java:107)

at android.media.MediaCodec$EventHandler.handleCallback(MediaCodec.java:1663)

at android.media.MediaCodec$EventHandler.handleMessage(MediaCodec.java:1621)

at android.os.Handler.dispatchMessage(Handler.java:105)

at android.os.Looper.loop(Looper.java:164)

at android.app.ActivityThread.main(ActivityThread.java:6541)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

【问题讨论】:

  • 尝试使用 MediaCodec.createByCodecName()。即使我遇到了这个问题,我也使用上述方法解决了它。我注意到在大多数联发科设备中 createDecoderByType 无法正常工作。
  • @Gautam 我刚刚检查过了。将MediaCodec.createDecoderByType("audio/mpeg") 更改为MediaCodec.createByCodecName("OMX.google.mp3.decoder"),但不幸的是效果是一样的。无论如何,感谢您的尝试。

标签: android android-mediacodec


【解决方案1】:

这里的data 是什么 - 整个 mp3 文件?您需要将其拆分为单独的数据包(例如使用MediaExtractor

然后,当将数据输入输入缓冲区时,inputBuffer.wrap(data); 不会做你想做的事。 wrap 实际上是一个静态方法,它创建一个新的ByteBuffer。你要的是inputBuffer.clear(); inputBuffer.put(data);

【讨论】:

  • 是的,data 是整个 mp3 文件。写“拆分为单个数据包”是什么意思?数据包是指样本、帧还是其他东西?
  • 谢谢。我现在有另一个问题,但这是另一个问题:)
猜你喜欢
  • 2013-07-24
  • 2023-04-07
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多