
新闻资讯
拥抱变化,赋能产业互联时代
视频编解码技术FFmpeg(二)
2023-07-31
首先我们通过下图所示来回顾一下上一篇文章所讲述的内容,网络摄像头采集数据图像推流给PC端直接展示,或者上传到服务器端,在把数据内容推送给用户终端设备,供用户观看。从图中我们可以看到一个新内容,解码-调整分辨率-编码的流程,这实质上是一个转码的流程,因为需要考虑到终端用户的网络带宽,设备支持的解码器类型,所以需要调整视频的分辨率用来适配用户的终端设备,这也就是平时我们在观看在线视频的时候,如果我们的网速比较差,网站就会推荐我们调整视频分辨率,让我们转换到低清模式。还有一点就是之前所说的随着技术的发展,出现了很多的编解码算法,如H264、H265和VP9等,而摄像头中的编码芯片使用的编码器一般都比较单一,只支持一种或两种编码算法,摄像头又是一用十几年,一旦出现新的优质的编码算法,能将视频数据压缩的更小且质量更高,又不能直接将这批摄像头淘汰掉,正如一些老旧社区之类的地方,但也不会使用这些老旧编码格式的视频流数据传输到用户端,因此就要在添加一个转码过程,将老旧的编码格式转换成新型高效的编码格式。
图1 编解码应用过程
转码流程如下图2所示,输入端为本地文件(mp4, avi, flv等)或者网络流(rtp,rtsp等),这些属于容器,经过解封装获取里面的音视频编码数据,使用相应的解码器获得元数据(yuv,rgb),这时候就可以对这些元数据进行数据处理(调整分辨率、镜像合并、裁剪等)操作,然后使用新型编码器进行编码,再封装起来保存成本地文件或者继续在网络中传播。
图2 转码过程
转码的优势如下图3所示,将视频转码就可以调整视频分辨率,生成不同清晰度的视频,清晰度越低对网络带宽的要求越低,就是对网速的要求更低,在大城市中千兆光纤已经十分普及,但还有很大一部分的用户使用着百兆宽带,通过调整分辨率就是满足不同用户的带宽需求。转码能够将编码格式转换成,终端设备解码器支持的视频流格式,这样才能保证终端设备正常观看。转码还是将旧的编码格式转变为新的编码格式,利用新编码格式的性能优势,亦能通过调整视频码率,提高视频压缩率,减小网络带宽要求。
图3 转码的意义
作为发展了这么久的编解码技术,每一种编解码规则都很复杂,因此法国天才程序员Fabrice Bellard在2000年时开发出了初版FFmpeg,该工具是既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等,并且FFmpeg框架提供丰富的插件,还是开源的,因此随着时代的发展,其成为了音视频行业使用的底层架构,基本所有的音视频播放软件都会使用其作为底层架构进行开发,已然成为行业标杆。这也导致了虽然其本身的编解码均采用软件编解码的形式,但由于其的便利性与广大用户受众,硬件编解码器厂商都会去支持其的规范,把自己作为一个插件提供给FFmpeg使用,这样音视频开发人员就是通过调用FFmpeg相应的API直接是用硬件编解码器的高效性能,而不用去专门学习其操作手册,相应的硬件编解码器就能快速普及。
FFmpeg框架由AVFormat、AVCodec、AVFilter、AVDevice、AVUtil、swresample、swscale等基础模块库组成,如下图4所示。
图4 FFmpeg模块库举例
FFmpeg正源于其通用性,因此也是支持各种操作系统平台,我们可以在其官网下载相应的内容,可以是其源码,选择我们所需要的内容编译成属于个人或企业的专用版本,也可直接使用其官网已经编译的可执行文件。以Windows平台举例,其FFmpeg源代码便后将生成三个可执行性文件,分别是ffmpeg、ffplay和ffprobe。ffplay可以用来直接播放影视频文件,ffprobe能够用来分析视频文件中的各种属性参数格式,而ffmpeg顾名思义其就包含了上诉过程中能够对视频进行处理的各项功能。下图5就是使用ffmpeg进行解码的一个示例,从图中可以简单的看出,一个h.264编码格式的视频解码成yuv420p的元数据,视频帧数一共是1589帧,每秒解码163帧。
图5 视频解码示例
对于C端用户来说,使用CPU进行解码就能正常满足观看视频的需求,因为人的肉眼正常能看到25帧每秒,集中精神的时候也不会超过30帧每秒,CPU性能完全足够。而对于B端用户来说,由于其设备经常需要满足多路视频编解码需求,因此就需要专业的编解码芯片,常见的有编解码芯片设备做成PCIE接口的硬件设备以及显卡,不论是AMD、Intel还是NVIDIA显卡都内部都有转码的编解码芯片单元,实质上性能都不会相差太远,主要性能差异主要取决于编解码芯片单元的个数。