2014-10-21 19 views
5

Ho un problema durante l'esecuzione di CameraToMpegTest.java da http://bigflake.com/mediacodec/. Quando inizio dalla attività:CameraToMpegTest.java non funziona, termina con IllegalStateException: Impossibile arrestare a causa di uno stato errato

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

    ... 

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

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

    } 

    ...  

Termino con questo logcat:

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 

Dopo alcuni test ho cercato di circondare chiamare mStManager.awaitNewImage(); con blocco try-catch con eccezioni stampa e ho ottenuto questo:

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. 

Sembra di essere problema simile come in questa domanda (android: SurfaceTexure, camera frame wait time out) ma il CameraToMpegTest.java utilizza thread separato.

Il mio dispositivo di test è Google Nexus 7 (2012) 32 GB 3G con Android 4.4.4.

Grazie per il vostro aiuto.

risposta

6

La classe MediaMuxer genera eccezioni "impossibile arrestare" se è stata avviata, ma non le ha ancora fornite dati. Questo non ha molto senso, ma è così che funziona.

Il problema principale è che non ci sono dati in entrata, che di solito è dovuto al problema identificato (una stranezza di SurfaceTexture descritta in dettaglio in this answer). È necessario assicurarsi che il thread che fa il lavoro non abbia un Looper.

Potrebbe essere meglio usare Grafika come codice di esempio. Attività come "acquisizione continua" dimostrano il percorso della telecamera in MPEG in un ambiente di app, piuttosto che un ambiente di test CTS.

+0

Ho usato Grafika's Show + capture camera Activity e funziona. Grazie. – Erniecz

Problemi correlati