注意点:
-
MediaCodec 解码后的原始数据,格式为yuv,而OpenGL所能渲染的格式为rgb,因此我们需要使用扩展库中的扩展纹理
GLES11Ext.GL_TEXTURE_EXTERNAL_OES
而它的作用就是实现YUV格式到RGB的自动转化。
片段着色器中需使用扩展采样器:
uniform samplerExternalOES sTexture
- COLOR_FormatYUV420Flexible
YUV420Flexible并不是一种确定的YUV420格式,而是包含COLOR_FormatYUV411Planar, COLOR_FormatYUV411PackedPlanar, COLOR_FormatYUV420Planar, COLOR_FormatYUV420PackedPlanar, COLOR_FormatYUV420SemiPlanar和COLOR_FormatYUV420PackedSemiPlanar。在API 21引入YUV420Flexible的同时,它所包含的这些格式都deprecated掉了。
那么为什么所有的解码器都支持YUV420Flexible呢?官方没有说明这点,但我猜测,只要解码器支持YUV420Flexible中的任意一种格式,就会被认为支持YUV420Flexible格式。也就是说,几乎所有的解码器都支持YUV420Flexible代表的格式中的一种或几种。
原理步骤:
- 生成一个oes纹理,并且以此得到一个SurfaceTexture,并设置帧可用回调监听,可用时请求渲染,再得到一个 Surface,并将它回调给外部MediaCodec 配置并启动解码器。(在ESL上下文环境中生成,因此需要通过回调给外部使用)
- 渲染完一帧后,需调用
surfaceTexture.updateTexImage() //更新纹理数据
- onFrameAvailable可用时,请求GLSurfaceView渲染重绘即可