我有一个管理自己的GLSurfaceView的应用程序,现在我想使用Android 4.3的新MediaCodec功能,将Surface作为输入。
在我看过的所有示例中,使用MediaCodec.createInputSurface()创建Surface,然后为此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) 这是否意味着这仅适用于解码而不是编码?如果是这样,有没有办法让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。
答案 0 :(得分:8)
不,它不会那样工作。必须使用createInputSurface()
创建输入表面。
请记住"表面"它不是数据的缓冲区,它是缓冲区队列,生产者和消费者端点通常位于不同的进程中。需要设置很多移动部件。另请注意,Surface
和EGLSurface
是两个不同的东西,虽然经常一起使用,但并不紧密相关。
API看起来很笨拙而且奇怪,因为它确实如此。多年来Surface
的实现发生了很大的变化 - 过去基础不太普遍,因此大多数用于改变端点的API都没有暴露出来。 (未指定的)MediaCodec
API仍在不断发展。
在Grafika中向GLSurfaceView
和MediaCodec
展示相同内容(相机预览)的示例。听起来你正在尝试做类似的事情。 (如果没有,请更新您的问题,我会更新答案。)
答案 1 :(得分:1)