MediaCodec 非法参数异常
MediaCodec IllegalArgumentException
我在使用 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.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)
这里的 data
是什么 - 整个 mp3 文件?您需要将其拆分为单独的数据包(例如使用 MediaExtractor
)
然后在将数据送入输入缓冲区时,inputBuffer.wrap(data);
并没有按照您的要求进行。 wrap
实际上是一个创建新ByteBuffer
的静态方法。你要的是inputBuffer.clear(); inputBuffer.put(data);
.
我在使用 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.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)
这里的 data
是什么 - 整个 mp3 文件?您需要将其拆分为单独的数据包(例如使用 MediaExtractor
)
然后在将数据送入输入缓冲区时,inputBuffer.wrap(data);
并没有按照您的要求进行。 wrap
实际上是一个创建新ByteBuffer
的静态方法。你要的是inputBuffer.clear(); inputBuffer.put(data);
.