金山云多媒体SDK团队在移动直播、短视频等项目中遇到了许多FFmpeg问题,特设立《FFmpeg从入门到出家》系列文稿,希望博君一笑的同时,能让大家对FFmpeg有更深入的了解。

视频流媒体中程中视频数据的传输占据了绝大部分的带宽,如何提升编码效率,使用更少的带宽,提供更优质的画面质量,是音视频开发人员一直努力的重点。HEVC(High Efficiency Video Coding,也叫H.265)编码格式的推出,给这一方向带来了突破点,但由于其算法复杂度较高,前期未曾得到普遍应用,而随着移动设备计算能力的提高和越来越多的设备开始支持HEVC的硬件编/解码,直播平台也开始逐渐引入HEVC视频格式。

HEVC属视频编码层面标准,如果在视频流媒体中进行应用,还需要相应的封装格式和流媒体协议的支持。鉴于直播的大部分推拉流协议是基于RTMP的,本文主要介绍如何在RTMP协议中增加对HEVC视频编码格式的支持,其他协议或私有协议,可参考本文自行添加。

1. 背景介绍

典型的直播框架通常包括三大部分,如下图所示:

1、推流端:负责音视频数据的采集、处理、编码及封装后将数据推送至源站;

2、服务端:涵盖源站和CDN,接收来自推流端的音视频数据,然后将数据分发至各播放端;

3、播放端:从CDN拉取直播数据,解复用、解码后渲染音视频数据;
FFmpeg从入门到出家(背景介绍)_第1张图片
图1. 直播框架图
引入HEVC编码,涉及到的变动部分如上图中红色字体所标注:

1、编码模块:需要支持HEVC格式的编解码,该部分不属于本文的介绍范畴,我们有在其它文章中介绍如何在iOS11上进行HEVC的硬编硬解,感兴趣的朋友可自行查阅;

2、封装/传输模块:RTMP、HTTP-FLV流媒体协议需要增加对HEVC视频编码格式的支持,该部分是本文介绍的重点。

相信广大的音视频开发者对于FFmpeg并不陌生,由于它在多媒体处理上提供的强大功能以及开源易于修改维护的特性,使得其被广泛应用于各音视频相关软件中。官方FFmpeg中,并没有对RTMP/FLV中进行HEVC的相关扩展,我们基于此作出了修改。本文后面介绍的就是如何在FFmpeg中,对RTMP进行HEVC扩展。如果您的开发工程中并没有用到FFmpeg,可直接阅读第四章节,也能够很轻松的在您的代码中增加这部分内容。