MediaCodec IllegalArgumentException

时间:2017-09-17 14:17:56

标签: android mediacodec

我使用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

            }
        }
 }

logcat的:

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)

1 个答案:

答案 0 :(得分:1)

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

然后,当将数据输入到输入缓冲区时,inputBuffer.wrap(data);无法执行您想要的操作。 wrap实际上是一种创建新ByteBuffer的静态方法。你想要的是inputBuffer.clear(); inputBuffer.put(data);