在Android上要实现一个录制功能,需要有几个方面的知识储备:自定义相机的开发、视频数据格式的了解、编码相关知识以及视频合成技术,同时如果需要美颜、磨皮等滤镜操作还需要一定的openGL的知识。
视频的编码录制主要是软编和硬编两种方案:
软编即采用CPU对相机采集的原始数据进行编码后再和音频一起合并成一个MP4等格式的文件。优点 是技术相对成熟,网上开源的编码以及合成库很多,实现相对较快,同时兼容性比较好。缺点 是CPU暂用率高,性能差的手机无法达到较大目标参数,同时引用了大量的第三方库,导致包很大。
软编的具体实现方案如下图所示,流程相对清晰简单:
camera采集YUV数据 ==> 滤镜 ==> x264编码器机型编码 ==> MP4打包合成
硬编即采用手机提供的硬编接口,利用硬件芯片直接进行编码合成。优点 是速度快、效率高、CPU占用极少,即使长时间高清录制也不会发烫,同时由于使用系统API,库相对较小。缺点 是某些奇葩机型需要处理兼容性问题,同时Android上的硬编跟Surface以及openGL关系比较密切,网上相关知识较少,需要自己摸索踩坑。
硬编的主要流程如下图所示,可以看到所有的数据,从采集、编码、显示以及合成都在GPU里面进行流转。