私は独自のGLSurfaceViewを管理するアプリを持っていますが、Android 4.3の新しいMediaCodec機能を使用してSurfaceを入力として使用したいと考えています。Androidでは、事前定義されたSurfaceをMediaCodecに渡してエンコードする方法はありますか?
私が見たすべての例では、SurfaceはMediaCodec.createInputSurface()を使用して作成され、このサーフェスのGLコンテキストが作成されます。これは、既に安定しているコードベースに改造するために、モノリシックであり、信じられないほど破壊的であると感じています。
ではなく MediaCodec.configure(フォーマット、 a_predefined_Surface、 ヌル、 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を使用させる方法はありますか?
私が渡しているSurfaceは、すでにEGL_RECORDABLE_ANDROIDをtrueに設定して作成されており、返されたGLコンテキストには必須のEGL_RECORDABLE_ANDROID属性が含まれていることが確認されています。それにもかかわらず、MediaCodec.configureは() ':無効な引数(-22)エラーを返しnative_window_api_connect':役に立たない例外で失敗
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とサムスンギャラクシーS4からです。
注意MediaCodecの 'createPersistentInputSurface()'コールで作成された「永続的入力面」です。 APIはより柔軟ですが、MediaCodecで作成されたSurfaceを使用する必要があります。 – fadden