我有一个管理自己的GLSurfaceView的应用程序,现在我想使用Android 4.3的新MediaCodec功能,该功能以Surface为输入。在我看到的所有示例中,Surface是使用MediaCodec.createInputSurface()创建的,然后为此Surface创建GL上下文。这感觉很庞大,而且很难嵌入到已经稳定的代码库中。是否可以使用MediaCodec.configure(format, a_predefined_Surface, null, MediaCodec.CONFIGURE_FLAG_ENCODE)呢?这使我能够以即插即用和按需方式使用MediaCodec。MediaCodec.configure()接受Surface参数表明这应该是可能的。但是,API说明了"指定要渲染此解码器输出的Surface"http://developer.android.com/reference/android/media/MediaCodec.html#configure(android.media.MediaFormat, android.view.Surface, android.media.MediaCrypto, int)。这是否意味着这仅适用于解码而不是编码?如果是这样,是否有任何方法使MediaCodec使用预定义的Surface进行编码?
这是来自装有Android 4.3的三星Galaxy S4的信息。
我传递的Surface已经设置了EGL_RECORDABLE_ANDROID为true,并且已验证返回的GL上下文包含所需的EGL_RECORDABLE_ANDROID属性。尽管如此,MediaCodec.configure()失败并显示一个无用的异常信息:“native_window_api_connect返回错误:Invalid 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)
这是来自装有Android 4.3的三星Galaxy S4的信息。