Android Camera系列(七):MediaCodec视频编码中-OpenGL ES多线程渲染

你做的再好,也还是有人指指点点;你即便一塌糊涂,也还是有人唱赞歌。所以不必掉进他人的眼神,你需要讨好的,仅仅是你自己。

本系列主要讲述Android开发中Camera的相关操作、预览方式、视频录制等。项目结构简单、代码耦合性低,旨在帮助大家能从中有所收获(方便copy :) ),对于个人来说也是一个总结的好机会。

Alt

引言

上一篇我们讲解了使用MediaCodec硬编码YUV数据进行视频录制,由于硬件厂商的原因存在一些兼容性的问题。而MediaCodec提供了COLOR_FormatSurface数据编码的方式,他是通过将数据渲染到MediaCodec提供的Surface中进行编码。该种方式兼容性好API > 4.3即可。本篇我们就详细介绍这种方式录制视频。

渲染数据到Surface?

上面提到要将数据渲染到Surface上,what?貌似我只会将Camera数据显示到SurfaceView或TextureView上呢。如果你仔细看了Android OpenGLES开发:EGL环境搭建Android Camera系列(四):TextureView+OpenGL ES+CameraAndroid Camera系列(五):Camera2这些篇章。那么你至少应该知道我们可以自己构建OpenGL ES环境,并通过Surface构建EGLSurface,然后使用OpenGL ES将数据渲染到Surface上。

还有一种方式就比较简单了,Camera2章节中我们知道预览和获取帧数据都需要Surface参数,而现在要将数据渲染到MediaCodec的Surface上,就需要把MediaCodec的Surface加进去即可,当然这种方式不再本章讨论的范围。

Surface是什么? Surface是Android对后台缓冲区的抽象,它是一块在应用和SurfaceFlinger之间共享的内存区域。所有的Android界面,在往屏幕上绘制内容前,都需要先获得一个或多个Surface,然后使用2D(SKIA)或者3D(OpenGL ES)引擎往这个缓冲区上绘制内容。内容绘制结束后,通知SurfaceFlinger将内容渲染到屏幕(Frame Buffer)上去。

整理下我们现在的需求:

  1. 创建MediaCodec,设置颜色格式COLOR_FormatSurface,并获取输入Surface
  2. 将Camera预览数据渲染到预览Surface(SurfaceView或TextureView)上,同时将预览数据渲染到MediaCodec的Surface上
  3. 编码Surface上的数据

一. 创建MediaCodec

将上一节中的MediaVideoBufferEncoder拷贝一份命名为MediaSurfaceEncoder,需要修改的地方如下:

  1. 配置颜色格式为COLOR_FormatSurface
final MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
format
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值