Android视频录制一直是个大问题,之前做一款短视频应用,视频录制采用ffmpeg,虽然做了很多优化,但是画面质量和帧率难以达到要求,至少达不到IOS的水准。所以痛下决心研究Android平台的硬编码方案。
所谓的硬编码就是采用DSP对视频帧进行编码,相对于软编码来说,硬编码的编码效率天差地别。更高的编码效率就意味着在相同帧率下能够获得更高的分辨率,更佳的画面质量。
(1)视频数据采集 从Camera中获取视频数据 (2)视频帧处理 添加视频滤镜,人脸识别等 可能还需要进行RGB转YUV (3)编码 FFmpeg/MediaCodec (4)Mux FFmpeg/MediaMuxer
目前短视频应用都是要求对视频的实时录制,对视频帧率要求至少24FPS。此外大部分应用还包含视频滤镜,人脸识别,添加人物饰品等需求。 按照最低24FPS的要求,每帧图像在各个流程的处理时间不超过1000/24 = 41.67ms,否则就会出现丢帧现象,造成视频卡顿。 (1)(4)视频采集和Mux阶段一般不会存在任何瓶颈,瓶颈在于视频帧(2)帧处理和(3)编码阶段,哪怕是异步进行也必须要求每个阶段的处理时间不能超过42ms。
(1)API Level限制 Android对视频进行硬编码需要用到MediaCodec, MediaMuxer最低要求API Level >= 16,其中个别非常重要的接口要求18以上。 不过目前API Level < 18的机型比较少了,哪怕是存在,机器的配置也实在太低了,就算是采用软编码方案,录制出来的视频效果极其糟糕。
(2)适配性较差 由于硬编码和手机硬件平台相关性较大,目前发现在部分机型上存在不兼容现象,所以并不能完全抛弃软编码方案作为硬编码的补充。
[1] Grafika [2] Google API MediaCodec
新闻热点
疑难解答