15

独自の 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 のものです。

4

2 に答える 2

9

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

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

API はでこぼこで奇妙に見えます。の実装はSurface何年にもわたってかなり変更されました。基盤は以前は一般的ではなかったため、エンドポイントを変更するための API のほとんどは公開されていません。(指定されていない) MediaCodecAPI はまだ進化中です。

GLSurfaceViewGrafikaMediaCodecで同じコンテンツ (カメラ プレビュー) を表示する例があります。似たようなことをしようとしているようです。(そうでない場合は、質問を更新してください。回答を更新します。)

于 2014-01-07T16:32:38.513 に答える
1

API 23+ には setInputSurface(Surface) という API があるようです:

setInputSurface(Surface) を使用した API 23+

于 2015-11-04T07:18:00.623 に答える