IllegalStateException bei MediaCodec.dequeInputBuffer / dequeOutputBuffer
Ich versuche zu konvertieren, eine PNG-Datei zu einer slice-video-clip, so nur, um ein start-up über ein Projekt.
Was ich hatte code, um Sie geschehen ist :-
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;
}
Und hier ist die Exception-Log:-
Wenn er versucht, laufen über Emulator 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
Aber, beim überfahren Galaxy Tab 3 (Gerät):
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)
Referenzen, nach denen ich dieses Projekt gestartet:-
Vielen Dank im Voraus.
was bedeutet NewClass enthält in Zeile Nummer 182 und 83 ?
Bitte überprüfen Sie code wieder, ich habe Kommentar im code, wo diese Linie nicht. ist.
legen Sie versuchen, n Fang für beide Zeilen code und sehen Sie einmal, wenn das problem weiterhin besteht
Ich weiß, wir können mit try/catch zu entfernen, Ausnahme, sondern eine Initialisierung, die erforderlich ist, sich weiter zu bewegen, wenn wir nur Fehler verarbeiten es dann es gebe
auch check this link, stackoverflow.com/questions/17233835/...
Bitte überprüfen Sie code wieder, ich habe Kommentar im code, wo diese Linie nicht. ist.
legen Sie versuchen, n Fang für beide Zeilen code und sehen Sie einmal, wenn das problem weiterhin besteht
Ich weiß, wir können mit try/catch zu entfernen, Ausnahme, sondern eine Initialisierung, die erforderlich ist, sich weiter zu bewegen, wenn wir nur Fehler verarbeiten es dann es gebe
NullPointException
auf seine Verwendung weiter.auch check this link, stackoverflow.com/questions/17233835/...
InformationsquelleAutor Harpreet | 2013-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, ich erwarte nicht, dass die emulator-codecs, überhaupt zu arbeiten. Wenn Sie funktionieren, bin ich angenehm überrascht. Dieser Ausblick hilft mir, um Enttäuschungen zu vermeiden.
Zweite, meine Vermutung wäre, dass die Größe des Frames übergeben wird in den encoder falsch ist. Du nimmst eine RGBA-frame dekodiert aus einer Bitmap und Stopfen es in ein YUV-420-Puffer. Und das funktioniert nicht. Die Menge der Daten, die Sie übergeben sollte genau das sein Breite * Höhe * 1.5 bytes für YUV420 (wo Schrittlänge==Breite und die Flugzeuge sind zusammen verpackt). Auf einem Android 4.3+ Geräte dieses Verhalten bestätigt wird über die CTS EncodeDecodeTest; ältere Geräte sind nicht garantiert, um zu arbeiten.
Außerdem können Sie festlegen, das format zu
COLOR_FormatYUV420SemiPlanar
; im Allgemeinen kann man nicht davon ausgehen, dass. Sie müssen die Abfrage der codec für die Liste der unterstützten Formate, zu bestimmen, ob die Eingabe muss planar sein oder semi-planar, und formatieren Sie dann den Puffer-Eingang entsprechend. Die Puffer-zu-Puffer und Puffer-zu-Oberfläche-tests in der EncodeDecodeTest zeigen, wie dies zu tun.Alternativ auf Android 4.3 und später, können Sie laden Sie die bitmap in eine textur, konfigurieren Sie die codec-Oberfläche für die Eingabe und machen die textur mit GLES (die können die hardware kümmern Skalierung Probleme, wenn der bitmap-Größe, passt nicht zu Ihrem video-Größe). Dies erfordert eine Menge mehr code aber.
Nachdem alles gesagt, dass, die
MediaCodec
Diagnose sind in der Regel nutzlos, so ist dies alles Spekulation.InformationsquelleAutor fadden