金山云多媒体 SDK 团队在移动直播、短视频等项目中遇到了许多 FFmpeg 问题,特设立《 FFmpeg 从入门到出家》系列文稿,希望博君一笑的同时,能让大家对 FFmpeg 有更深入的了解。
视频流媒体中程中视频数据的传输占据了绝大部分的带宽,如何提升编码效率,使用更少的带宽,提供更优质的画面质量,是音视频开发人员一直努力的重点。HEVC(High Efficiency Video Coding,也叫 H.265)编码格式的推出,给这一方向带来了突破点,但由于其算法复杂度较高,前期未曾得到普遍应用,而随着移动设备计算能力的提高和越来越多的设备开始支持 HEVC 的硬件编 /解码,直播平台也开始逐渐引入 HEVC 视频格式。
HEVC 属视频编码层面标准,如果在视频流媒体中进行应用,还需要相应的封装格式和流媒体协议的支持。鉴于直播的大部分推拉流协议是基于 RTMP 的,本文主要介绍如何在 RTMP 协议中增加对 HEVC 视频编码格式的支持,其他协议或私有协议,可参考本文自行添加。
典型的直播框架通常包括三大部分,如下图所示:
1、推流端:负责音视频数据的采集、处理、编码及封装后将数据推送至源站;
2、服务端:涵盖源站和 CDN,接收来自推流端的音视频数据,然后将数据分发至各播放端;
3、播放端:从 CDN 拉取直播数据,解复用、解码后渲染音视频数据;
引入 HEVC 编码,涉及到的变动部分如上图中红色字体所标注:
1、编码模块:需要支持 HEVC 格式的编解码,该部分不属于本文的介绍范畴,我们有在其它文章中介绍如何在 iOS11 上进行 HEVC 的硬编硬解,感兴趣的朋友可自行查阅;
2、封装 /传输模块:RTMP、HTTP-FLV 流媒体协议需要增加对 HEVC 视频编码格式的支持,该部分是本文介绍的重点。
相信广大的音视频开发者对于 FFmpeg 并不陌生,由于它在多媒体处理上提供的强大功能以及开源易于修改维护的特性,使得其被广泛应用于各音视频相关软件中。官方 FFmpeg 中,并没有对 RTMP/FLV 中进行 HEVC 的相关扩展,我们基于此作出了修改。本文后面介绍的就是如何在 FFmpeg 中,对 RTMP 进行 HEVC 扩展。如果您的开发工程中并没有用到 FFmpeg,可直接阅读第四章节,也能够很轻松的在您的代码中增加这部分内容。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.