2014-01-07 101 views
9

私は独自の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からです。

答えて

7

いいえ、それはそのようには動作しません。入力サーフェスはcreateInputSurface()で作成する必要があります。

「サーフェス」はデータのバッファではなく、プロデューサとコンシューマのエンドポイントが異なるプロセスにあることが多いバッファのキューです。セットアップが必要な動く部分がたくさんあります。また、SurfaceEGLSurfaceは、しばしば一緒に使用されるが、密接に関連していない2つの異なることに注意してください。

APIはかすかで奇妙なものだと思われます。 Surfaceの実装は、長年にわたりかなり変更されました。これまでは、一般的ではないため、エンドポイントを変更するためのAPIのほとんどは公開されていませんでした。 MediaCodec APIはまだ進化しています。

GLSurfaceViewMediaCodecに同じコンテンツ(カメラプレビュー)をGrafikaに表示する例があります。それはあなたが似たようなことをしようとしているように思えます。 (ない場合は、あなたの質問を更新し、私は答えを更新します。)

1

APIで23+ APIと呼ばれるsetInputSurface(表面)があるようです:それがかかること

API 23+ with setInputSurface(Surface)

+0

注意MediaCodecの 'createPersistentInputSurface()'コールで作成された「永続的入力面」です。 APIはより柔軟ですが、MediaCodecで作成されたSurfaceを使用する必要があります。 – fadden

関連する問題