Sto lavorando a un'applicazione di codifica video che voglio impedire di arrestare quando l'attività di hosting entra nello sfondo, o lo schermo si attiva/disattiva.MediaCodec con Surface Input: registrazione in background
L'architettura del mio encoder è derivata dall'eccellente esempio CameraToMpegTest, con l'aggiunta della visualizzazione di fotogrammi della telecamera su un GLSurfaceView (vedere i collegamenti Github di seguito). Attualmente sto eseguendo sfondo la registrazione con una soluzione a due stati:
Quando l'hosting di attività è in primo piano, codificare un frame video su ogni chiamata a 's il
GLSurfaceView.Renderer
. Ciò mi consente di accedere allo stato EGL di GLSurfaceView a raffica in modo da non bloccare altri eventi in coda al thread di rendering.Quando l'attività di hosting passa allo sfondo, interrompere la codifica e codificare fotogrammi su un altro thread in background all'interno di un ciclo. Questa modalità è identica all'esempio di CameraToMpegTest.
Tuttavia se lo schermo è spento EGLContext del GLSurfaceView è perduto e una nuova chiamata a onSurfaceCreated
verifica. In questo caso dobbiamo ricreare la superficie della finestra EGL collegata alla superficie di input di MediaCodec. Purtroppo questo secondo invito a eglCreateWindowSurface
produce:
E/libEGL(18839): EGLNativeWindowType 0x7a931098 already connected to another API
prima di chiamare, io release all EGL resources connected to the Android Surface.
C'è un modo per scambiare la superficie EGLSurface collegata alla superficie di ingresso di MediaCodec?
La fonte completa della mia applicazione di prova è Github. Main Activity.
Aggiornamento ho applicato le lezioni apprese qui in una video sdk for Android basata sulle classi MediaMuxer MediaCodec &. Spero che sia d'aiuto!
'MediaCodec' non dovrebbe essere influenzato (o nemmeno a conoscenza) di essere in background. Vedi per es. il comando 'screenrecord' aggiunto in Android 4.4, che corre felicemente dietro le quinte. Il fatto che stia codificando * qualsiasi cosa * significa che continua a ricevere dati di input, suppongo che qualcosa stia influenzando 'Camera'. Non capisco perché causerebbe l'anteprima 'Surface' da vuoto mentre l'anteprima' byte [] 'ha dati reali. – fadden
Aggiornata la mia domanda. Ora sono in grado di passare alla registrazione in background (senza display GLSurfaceView) e quindi alla registrazione in primo piano (display GLSurfaceView) ** eccetto ** quando si verifica un evento di spegnimento/accensione nello schermo ... – dbro
Manca un 'glSurfaceView .onPause() 'nella tua attività principale onPause(). Non sono sicuro se ciò avrà importanza. Potrei essere in grado di giocarci un po 'domani e vedere se riesco a replicare il comportamento. – fadden