IllegalStateException в MediaCodec.dequeInputBuffer / dequeOutputBuffer

Я пытаюсь преобразовать PNG-файл в один фрагмент видеоклипа, чтобы просто запустить проект над проектом.

У меня был код, чтобы это произошло:

private boolean MediaConversion() { MediaCodec codec = MediaCodec.createEncoderByType(MIMETYPE); MediaFormat mediaFormat = null; if(CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)){ mediaFormat = MediaFormat.createVideoFormat(MIMETYPE, 1280 , 720); } else { mediaFormat = MediaFormat.createVideoFormat(MIMETYPE, 720, 480); } mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 700000); mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 10); mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5); codec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); codec.start(); ByteBuffer[] inputBuffers = codec.getInputBuffers(); ByteBuffer[] outputBuffers = codec.getOutputBuffers(); boolean sawInputEOS = false; int inputBufferIndex= -1, outputBufferIndex= -1; BufferInfo info=null; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.image); Log.e("Uploaded", "Bitmap:" + bitmap.getWidth() + "X" + bitmap.getHeight()); } catch (Exception e) { e.printStackTrace(); } bitmap = Bitmap.createScaledBitmap(bitmap, WIDTH, HEIGHT, false); bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); byte[] dat = byteArrayOutputStream.toByteArray(); info = new BufferInfo(); **// Exception occurred on this below line in Emulator, LINE No. 182//** inputBufferIndex = codec.dequeueInputBuffer(WAITTIME); if(dat.length<=0) sawInputEOS=true; if(inputBufferIndex >= 0){ if(!sawInputEOS){ int samplesiz= dat.length; inputBuffers[inputBufferIndex].put(dat); codec.queueInputBuffer(inputBufferIndex, 0, samplesiz, presentationTime, 0); presentationTime += 100; **// Exception occurred on this below line in DEVICE, LINE No. 193 //** outputBufferIndex = codec.dequeueOutputBuffer(info, WAITTIME); Log.i("BATA", "outputBufferIndex="+outputBufferIndex); if(outputBufferIndex >= 0){ byte[] array = new byte[info.size]; outputBuffers[outputBufferIndex].get(array); if(array != null){ dos = array; } codec.releaseOutputBuffer(outputBufferIndex, false); inputBuffers[inputBufferIndex].clear(); outputBuffers[outputBufferIndex].clear(); } }else{ codec.queueInputBuffer(inputBufferIndex, 0, 0, presentationTime, MediaCodec.BUFFER_FLAG_END_OF_STREAM); outputBufferIndex = codec.dequeueOutputBuffer(info, WAITTIME); Log.i("CHAK", "outputBufferIndex="+outputBufferIndex); if(outputBufferIndex >= 0){ byte[] array = new byte[info.size]; outputBuffers[outputBufferIndex].get(array); if(array != null){ dos = array; } codec.releaseOutputBuffer(outputBufferIndex, false); inputBuffers[inputBufferIndex].clear(); outputBuffers[outputBufferIndex].clear(); } } } codec.stop(); codec.release(); codec = null; return true; } 

И вот журнал исключений:

Когда пытались запустить эмулятор Api Level 19:

 12-02 23:58:58.214: E/SoftAVCEncoder(1193): internalSetParameter: StoreMetadataInBuffersParams.nPortIndex not zero! 12-02 23:58:58.214: E/OMXNodeInstance(1193): OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x80001001 12-02 23:58:58.224: E/ACodec(1193): [OMX.google.h264.encoder] storeMetaDataInBuffers (output) failed w/ err -2147483648 12-02 23:58:58.224: I/ACodec(1193): setupVideoEncoder succeeded 12-02 23:58:58.254: E/SoftAVCEncoder(1193): Failed to initialize the encoder: -8 12-02 23:58:58.254: E/ACodec(1193): [OMX.google.h264.encoder] ERROR(0x80001001) 12-02 23:58:58.254: E/MediaCodec(1193): Codec reported an error. (omx error 0x80001001, internalError -2147483648) 12-02 23:59:00.424: E/AndroidRuntime(1193): FATAL EXCEPTION: main 12-02 23:59:00.424: E/AndroidRuntime(1193): Process: com.antech.kefilm, PID: 1193 12-02 23:59:00.424: E/AndroidRuntime(1193): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.antech.kefilm/com.antech.kefilm.NewClass}: java.lang.IllegalStateException 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176) 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226) 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.app.ActivityThread.access$700(ActivityThread.java:135) 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397) 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.os.Handler.dispatchMessage(Handler.java:102) 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.os.Looper.loop(Looper.java:137) 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.app.ActivityThread.main(ActivityThread.java:4998) 12-02 23:59:00.424: E/AndroidRuntime(1193): at java.lang.reflect.Method.invokeNative(Native Method) 12-02 23:59:00.424: E/AndroidRuntime(1193): at java.lang.reflect.Method.invoke(Method.java:515) 12-02 23:59:00.424: E/AndroidRuntime(1193): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 12-02 23:59:00.424: E/AndroidRuntime(1193): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 12-02 23:59:00.424: E/AndroidRuntime(1193): at dalvik.system.NativeStart.main(Native Method) 12-02 23:59:00.424: E/AndroidRuntime(1193): Caused by: java.lang.IllegalStateException 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.media.MediaCodec.dequeueInputBuffer(Native Method) 12-02 23:59:00.424: E/AndroidRuntime(1193): at com.antech.kefilm.NewClass.MediaConversion(NewClass.java:182) 12-02 23:59:00.424: E/AndroidRuntime(1193): at com.antech.kefilm.NewClass.onCreate(NewClass.java:83) 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.app.Activity.performCreate(Activity.java:5243) 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 12-02 23:59:00.424: E/AndroidRuntime(1193): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140) 12-02 23:59:00.424: E/AndroidRuntime(1193): ... 11 more 

Но при запуске Galaxy Tab 3 (устройство):

 12-03 05:32:09.670: E/ACodec(3096): [OMX.MARVELL.VIDEO.HW.CODA7542ENCODER] ERROR(0x80001005) 12-03 05:32:09.670: E/MediaCodec(3096): Codec reported an error. (omx error 0x80001005, internalError -2147483648) 12-03 05:32:09.670: E/AndroidRuntime(3096): Caused by: java.lang.IllegalStateException 12-03 05:32:09.670: E/AndroidRuntime(3096): at android.media.MediaCodec.dequeueOutputBuffer(Native Method) 12-03 05:32:09.670: E/AndroidRuntime(3096): at com.antech.kefilm.NewClass.MediaConversion(NewClass.java:193) 12-03 05:32:09.670: E/AndroidRuntime(3096): at com.antech.kefilm.NewClass.onCreate(NewClass.java:83) 

Ссылки, согласно которым я начал этот проект: –

  • Ques: использование MediaCodec для сохранения серии изображений в виде видео
  • Материал: Android MediaCodec

Заранее спасибо.

Solutions Collecting From Web of "IllegalStateException в MediaCodec.dequeInputBuffer / dequeOutputBuffer"

Во-первых, я не ожидаю, что кодеки эмулятора будут работать вообще. Если они действительно работают, я приятно удивлен. Этот взгляд помогает мне избежать разочарования.

Во-вторых, я предполагаю, что размер кадра, передаваемого в кодировщик, неверен. Вы принимаете рамку RGBA, декодированную из растрового изображения, и набиваете ее в буфер YUV 420. Это не работает. Объем данных, которые вы передаете, должен быть точно шириной * высоты * 1,5 байта для YUV420 (где stride == width и плоскости упакованы вместе). На устройстве Android 4.3+ это поведение подтверждается с помощью CTS EncodeDecodeTest ; Более старые устройства не гарантированно работают.

Кроме того, вы устанавливаете формат COLOR_FormatYUV420SemiPlanar ; В общем, вы не можете этого допустить. Вам нужно запросить кодек для списка поддерживаемых форматов, определить, должен ли вход быть плоским или полу планарным, а затем соответствующим образом форматировать вход буфера. Тесты «буфер-буфер» и «буфер-поверхность» в EncodeDecodeTest демонстрируют, как это сделать.

В качестве альтернативы, на Android 4.3 и более поздних версиях вы можете загрузить растровое изображение в текстуру, настроить кодек для ввода поверхности и визуализировать текстуру с помощью GLES (что позволяет аппаратным средствам заботиться о любых проблемах масштабирования, если размер растрового изображения не соответствует вашему размер видео). Это занимает гораздо больше кода.

Сказав все это, диагностика MediaCodec обычно бесполезна, так что это все догадки.