W systemie Android, jak przekazać predefiniowaną powierzchnię do MediaCodec do kodowania?

Mam aplikację, która zarządza własnym GLSurfaceView, a teraz chcę użyć nowej funkcji MediaCodec systemu Android 4.3, która pobiera powierzchnię jako dane wejściowe.

We wszystkich przykładach, które widziałem, powierzchnia jest tworzona przy użyciu MediaCodec.createInputSurface (), a następnie kontekst GL jest tworzony dla tej powierzchni. Jest to monolityczne i niewiarygodnie uciążliwe, aby doposażać w bazę kodów, która jest już stabilna.

Czy można zamiast tego użyć MediaCodec.configure (format, a_predefined_Surface, null, MediaCodec.CONFIGURE_FLAG_ENCODE)? Dzięki temu mogę korzystać z MediaCodec w trybie plug-and-play i na żądanie. Fakt, że MediaCodec.configure () pobiera parametr Surface wskazuje, że powinno to być możliwe. Interfejs API stwierdza jednak, że „Określ powierzchnię, na której będzie renderowany wynik tego dekodera”http://developer.android.com/reference/android/media/MediaCodec.html#configure(android.media.MediaFormat, android.view.Surface, android.media.MediaCrypto, int) oznacza, że ​​jest to przeznaczone tylko dlarozszyfrować i niekodować? Jeśli tak, czy jest jakiś sposób, aby MediaCodec używał predefiniowanej powierzchni do kodowania?

Powierzchnia, którą przekazuję, jest już utworzona z ustawieniem EGL_RECORDABLE_ANDROID na true, a zwrócony kontekst GL jest sprawdzany, aby zawierał wymagany atrybut EGL_RECORDABLE_ANDROID. Mimo to MediaCodec.configure () kończy się niepowodzeniem z niepomyślnym wyjątkiem „native_window_api_connect zwrócił błąd: Niepoprawny argument (-22)”:

I/ACodec(32383):  Now uninitialized
I/OMXClient(32383): Using client-side OMX mux.
I/ACodec(32383): [OMX.qcom.video.encoder.avc] Now Loaded
E/MediaCodec(32383): native_window_api_connect returned an error: Invalid argument (-22)
W/System.err(32383): java.lang.IllegalStateException
W/System.err(32383):    at android.media.MediaCodec.native_configure(Native Method)
W/System.err(32383):    at android.media.MediaCodec.configure(MediaCodec.java:259)
[...]
W/System.err(32383):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520)
W/System.err(32383):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)

To jest z Samsung Galaxy S4 z Androidem 4.3.

questionAnswers(2)

yourAnswerToTheQuestion