解决:android NDK的AMediaCodec配置surface失败问题

Android MediaCodec与NDK AMediaCodec的关系

从API 21(Android 5.0)开始Android提供C层的NDK MediaCodec的接口。Android MediaCodec是对NDK AMediaCodec的封装。一般来说,MediaCodec输出到surface;AMediaCodec输出yuv数据。
我们使用NDK的AMediaCodec的原因是:方便拿到解码后的yuv数据,并使用OpenGL进行渲染。
注意:MediaCodec和AMediaCodec都是可以绑定surface直接显示的。

问题描述

使用MediaCodec解码器配置surface没有问题,但是将NDK的AMediaCodec解码器配置surface时,出现了错误。代码如下:

result = AMediaCodec_configure(iMediaCodec->Codec, format, iMediaCodec->window, NULL, 0);

解决过程

查资料并分析,NDK的AMediaCodec是支持与surface绑定的,即原理上行得通,应该是没有用对。查看log信息如下:
D/SurfaceUtils(20824): connecting to surface 0x7e7be73010, reason connectToSurface.
E/BufferQueueProducer( 619): [SurfaceView - xxx] connect: already connected (cur=1 req=3).
E/SurfaceUtils(20824): Failed to connect to surface 0x7e7be73010, err -22.
nativeWindowConnect returned an error: Invalid argument (-22).
configure failed with err 0xffffffea, resetting…
重点是[SurfaceView - xxx] connect: already connected (cur=1 req=3).即surface已经和别的对象链接过
重新检查代码,发现surface已经和有关OpenGL的一个对象链接。于是取消链接,NDK的AMediaCodec与surface成功绑定。如图:
解决:android NDK的AMediaCodec配置surface失败问题_第1张图片

你可能感兴趣的:(解决:android NDK的AMediaCodec配置surface失败问题)