MediaCodec z wejściem powierzchniowym: tworzenie fragmentarycznych danych wyjściowych
Próbuję tworzyć krótkie sekwencyjne pliki mp4 z danych CameraPreview za pośrednictwemMediaCodec.createInputSurface()
. Jednak odtworzenieMediaCodec
a związana z nią powierzchnia wymaga zatrzymania kamery, aby umożliwić inne połączeniemCamera.setPreviewTexture(...)
. To opóźnienie powoduje niedopuszczalną ilość upuszczonych klatek.
Dlatego muszę wygenerowaćCODEC_CONFIG
iEND_OF_STREAM
dane okresowo bez odtwarzania powierzchni wejściowej, a tym samym konieczności wywołaniamCamera.setPreviewTexture(...)
. Czy to możliwe przy założeniuMediaFormat
jest niezmieniony?
(Dostosowuję faddenaCameraToMpegTest przykład. Mój kompletny kod totutaj)
Nieudane próby:
PowołanieMediaCodec.signalEndOfInputStream()
, osuszającMediaCodec
, a następnie dzwoniącMediaCodec.flush()
między kawałkami powstajeIllegalStateException
przy drugim połączeniu doMediaCodec.signalEndOfInputStream()
.
PowołanieMediaCodec.signalEndOfInputStream()
, osuszającMediaCodec
, a następnie dzwoniącMediaCodec.stop(); MediaCodec.configure(...), MediaCodec.start()
między kawałkami bez ponownego dzwonieniaMediaCodec.createInputSurface()
powoduje następujący błąd:
09-30 13:12:49.889 17638-17719/x.xx.xxxx E/Surface﹕ queueBuffer: error queuing buffer to SurfaceTexture, -19
09-30 13:12:49.889 17638-17719/x.xx.xxxx E/IMGSRV﹕ :0: UnlockPostBuffer: Failed to queue buffer 0x592e1e70
09-30 13:12:49.889 17638-17719/x.xx.xxxx E/CameraToMpegTest﹕ Encoding loop exception!
09-30 13:12:49.889 17638-17719/x.xx.xxxx W/System.err﹕ java.lang.RuntimeException: eglSwapBuffers: EGL error: 0x300b
09-30 13:12:49.896 17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.ChunkedHWRecorder$CodecInputSurface.checkEglError(ChunkedHWRecorder.java:731)
09-30 13:12:49.896 17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.ChunkedHWRecorder$CodecInputSurface.swapBuffers(ChunkedHWRecorder.java:713)
09-30 13:12:49.896 17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.ChunkedHWRecorder.startRecording(ChunkedHWRecorder.java:164)
09-30 13:12:49.896 17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.HWRecorderActivity$CameraToMpegWrapper.run(HWRecorderActivity.java:76)
09-30 13:12:49.896 17638-17719/x.xx.xxxx W/System.err﹕ at java.lang.Thread.run(Thread.java:841)
Rozwiązany Dzięki Fadden. Kompletne źródło rozwiązania totutaj.