独自の GLSurfaceView を管理するアプリがあり、Surface を入力として受け取る Android 4.3 の新しい MediaCodec 機能を使用したいと考えています。
私が見たすべての例では、Surface は MediaCodec.createInputSurface() を使用して作成され、次にこの Surface の GL コンテキストが作成されます。これはモノリシックで、すでに安定しているコード ベースに後付けするのは信じられないほど破壊的だと感じます。
代わりに MediaCodec.configure(format, a_predefined_Surface, null, MediaCodec.CONFIGURE_FLAG_ENCODE) を使用することは可能ですか? これにより、プラグ アンド プレイおよびオンデマンドの方法で MediaCodec を使用できます。MediaCodec.configure() が Surface パラメーターを取るという事実は、これが可能であることを示しています。ただし、API には、「このデコーダーの出力をレンダリングするサーフェスを指定してください」と記載されています http://developer.android.com/reference/android/media/MediaCodec.html#configure(android.media.MediaFormat , android. view.Surface, android.media.MediaCrypto, int) は、これはデコードのみを目的としており、エンコードは意図していないことを意味しますか?. もしそうなら、MediaCodec がエンコードに定義済みの Surface を使用するようにする方法はありますか?
私が渡しているサーフェスは、EGL_RECORDABLE_ANDROID が true に設定された状態で既に作成されており、返された GL コンテキストには、必要な EGL_RECORDABLE_ANDROID 属性が含まれていることが確認されています。それにもかかわらず、MediaCodec.configure() は役に立たない例外「native_window_api_connect がエラーを返しました: 無効な引数 (-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)
これは、Android 4.3 を搭載した Samsung Galaxy S4 のものです。