2014-10-21 6 views
5

Ich habe ein Problem mit CameraToMpegTest.java von http://bigflake.com/mediacodec/. Wenn ich starten Sie es von der Aktivität:CameraToMpegTest.java funktioniert nicht, endet mit IllegalStateException: Kann aufgrund eines falschen Status nicht stoppen

public class MyActivity extends Activity { 
    private CameraToMpegTest ctmt = new CameraToMpegTest(); 

    ... 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     try { 
      ctmt.testEncodeCameraToMp4(); 
     } catch (Throwable throwable) { 
      throwable.printStackTrace(); 
     } 

    } 

    ...  

ich mit diesem logcat Ende:

D/CameraToMpegTest﹕ video/avc output 640x480 @6000000 
D/CameraToMpegTest﹕ Camera preview size is 640x480 
I/OMXClient﹕ Using client-side OMX mux. 
E/ACodec﹕ [OMX.Nvidia.h264.encoder] storeMetaDataInBuffers (output) failed w/ err -2147483648 
I/ACodec﹕ setupVideoEncoder succeeded 
D/libEGL﹕ loaded /system/lib/egl/libEGL_tegra.so 
D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_tegra.so 
D/libEGL﹕ loaded /system/lib/egl/libGLESv2_tegra.so 
I/CameraToMpegTest﹕ Output file is /storage/emulated/0/test.640x480.mp4 
W/System.err﹕ java.lang.IllegalStateException: Can't stop due to wrong state. 
W/System.err﹕ at android.media.MediaMuxer.stop(MediaMuxer.java:229) 
W/System.err﹕ at CameraToMpegTest.releaseEncoder(CameraToMpegTest.java:395) 
W/System.err﹕ at CameraToMpegTest.encodeCameraToMpeg(CameraToMpegTest.java:216) 
W/System.err﹕ at CameraToMpegTest.access$000(CameraToMpegTest.java:68) 
W/System.err﹕ at CameraToMpegTest$CameraToMpegWrapper.run(CameraToMpegTest.java:128) 
W/System.err﹕ at java.lang.Thread.run(Thread.java:841) 
D/OpenGLRenderer﹕ Enabling debug mode 0 

Nach einigen Tests ich Aufruf mStManager.awaitNewImage zu umgeben versucht(); mit try-catch-Block mit Ausnahmen Druck und ich dies bekam:

D/CameraToMpegTest﹕ video/avc output 640x480 @6000000 
D/CameraToMpegTest﹕ Camera preview size is 640x480 
I/OMXClient﹕ Using client-side OMX mux. 
E/ACodec﹕ [OMX.Nvidia.h264.encoder] storeMetaDataInBuffers (output) failed w/ err -2147483648 
I/ACodec﹕ setupVideoEncoder succeeded 
D/libEGL﹕ loaded /system/lib/egl/libEGL_tegra.so 
D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_tegra.so 
D/libEGL﹕ loaded /system/lib/egl/libGLESv2_tegra.so 
I/CameraToMpegTest﹕ Output file is /storage/emulated/0/test.640x480.mp4 
I/System.out﹕ java.lang.RuntimeException: Camera frame wait timed out 
I/System.out﹕ java.lang.RuntimeException: Camera frame wait timed out 
D/CameraToMpegTest﹕ encoder output format changed: {csd-1=java.nio.ByteArrayBuffer[position=0,limit=8,capacity=8], height=480, mime=video/avc, csd-0=java.nio.ByteArrayBuffer[position=0,limit=13,capacity=13], what=1869968451, width=640} 
I/MPEG4Writer﹕ limits: 4294967295/0 bytes/us, bit rate: -1 bps and the estimated moov size 3072 bytes 
I/MPEG4Writer﹕ setStartTimestampUs: 0 
I/MPEG4Writer﹕ Earliest track starting time: 0 
I/System.out﹕ java.lang.RuntimeException: Camera frame wait timed out 
W/MPEG4Writer﹕ 0-duration samples found: 1 
W/MPEG4Writer﹕ 0-duration samples found: 2 
I/MPEG4Writer﹕ Received total/0-length (3/0) buffers and encoded 3 frames. - video 
D/MPEG4Writer﹕ Stopping Video track 
D/MPEG4Writer﹕ Stopping Video track source 
D/MPEG4Writer﹕ Video track stopped 
D/MPEG4Writer﹕ Stopping writer thread 
D/MPEG4Writer﹕ 0 chunks are written in the last batch 
D/MPEG4Writer﹕ Writer thread stopped 
D/MPEG4Writer﹕ Stopping Video track 
D/OpenGLRenderer﹕ Enabling debug mode 0 
I/Choreographer﹕ Skipped 90 frames! The application may be doing too much work on its main thread. 

Es scheint ähnliches Problem wie in dieser Frage (android: SurfaceTexure, camera frame wait time out), aber die CameraToMpegTest.java verwendet separaten Thread zu sein.

Mein Testgerät ist Google Nexus 7 (2012) 32GB 3G mit 4.4.4 Android.

Vielen Dank für Ihre Hilfe.

Antwort

6

Die Klasse MediaMuxer wird Ausnahmen "nicht stoppen" auslösen, wenn Sie sie gestartet haben, aber noch keine Daten eingegeben haben. Das macht nicht viel Sinn, aber so funktioniert es.

Das Grundproblem besteht darin, dass keine Daten eingehen, was normalerweise auf das von Ihnen identifizierte Problem zurückzuführen ist (eine Besonderheit von SurfaceTexture, die in einem Detail in this answer beschrieben wird). Sie müssen sicherstellen, dass der Thread, der die Arbeit erledigt, keinen Looper hat.

Sie können besser Grafika als Beispielcode verwenden. Aktivitäten wie "Continuous Capture" demonstrieren den Kamera-zu-MPEG-Pfad in einer App-Umgebung und nicht in einer CTS-Testumgebung.

+0

Ich habe Grafika Show + Kamera-Aktivität und es funktioniert. Vielen Dank. – Erniecz