【发布时间】:2014-01-24 16:42:01
【问题描述】:
我有一个管理自己的 GLSurfaceView 的应用,现在我想使用 Android 4.3 的新 MediaCodec 功能,该功能将 Surface 作为输入。
在我见过的所有示例中,Surface 都是使用 MediaCodec.createInputSurface() 创建的,然后为此 Surface 创建 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) 这是否意味着这仅适用于 decode 而不是 encode?如果是这样,有什么方法可以让 MediaCodec 使用预定义的 Surface 进行编码?
我传入的 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 的三星 Galaxy S4。
【问题讨论】:
标签: android android-mediacodec