你做的再好,也还是有人指指点点;你即便一塌糊涂,也还是有人唱赞歌。所以不必掉进他人的眼神,你需要讨好的,仅仅是你自己。
-
Android Camera系列(一):SurfaceView+Camera
-
Android Camera系列(二):TextureView+Camera
-
Android Camera系列(三):GLSurfaceView+Camera
-
Android Camera系列(四):TextureView+OpenGL ES+Camera
-
Android Camera系列(五):Camera2
-
Android Camera系列(六):MediaCodec视频编码上-编码YUV
-
Android Camera系列(七):MediaCodec视频编码中-OpenGL ES多线程渲染
-
Android Camera系列(八):MediaCodec视频编码下-OpenGL ES离屏渲染
本系列主要讲述Android开发中Camera的相关操作、预览方式、视频录制等。项目结构简单、代码耦合性低,旨在帮助大家能从中有所收获(方便copy :) ),对于个人来说也是一个总结的好机会。
引言
上一篇我们讲解了使用MediaCodec
硬编码YUV数据进行视频录制,由于硬件厂商的原因存在一些兼容性的问题。而MediaCodec
提供了COLOR_FormatSurface
数据编码的方式,他是通过将数据渲染到MediaCodec
提供的Surface
中进行编码。该种方式兼容性好API > 4.3即可。本篇我们就详细介绍这种方式录制视频。
渲染数据到Surface?
上面提到要将数据渲染到Surface上,what?貌似我只会将Camera数据显示到SurfaceView或TextureView上呢。如果你仔细看了Android OpenGLES开发:EGL环境搭建、Android Camera系列(四):TextureView+OpenGL ES+Camera、Android 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)上去。
整理下我们现在的需求:
- 创建MediaCodec,设置颜色格式
COLOR_FormatSurface
,并获取输入Surface - 将Camera预览数据渲染到预览Surface(SurfaceView或TextureView)上,同时将预览数据渲染到MediaCodec的Surface上
- 编码Surface上的数据
一. 创建MediaCodec
将上一节中的MediaVideoBufferEncoder
拷贝一份命名为MediaSurfaceEncoder
,需要修改的地方如下:
- 配置颜色格式为
COLOR_FormatSurface
final MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
format