FFmpeg代码导读——HEVC在RTMP中的扩展

本文介绍了如何在RTMP协议中增加对HEVC视频编码格式的支持,详细讲解了在FFmpeg中扩展FLV规范,包括VideoTagHeader和VideoTagBody的修改,以及解复用和复用过程的关键点。通过这些修改,实现了HEVC在直播推流和播放中的应用。
摘要由CSDN通过智能技术生成


视频流媒体中视频数据的传输占据了绝大部分的带宽,如何提升编码效率、减小带宽使用、提升画面质量,成为音视频开发者努力的重点。HEVC编码格式的推出为此带来了突破点。对于直播而言,大部分推拉流协议是基于RTMP的,因此本文将主要介绍如何在RTMP协议中增加对HEVC视频编码格式的支持。


本文来自金山云OBG事业部投稿,是《FFmpeg从入门到出家》系列的第一篇下半部分,由LiveVideoStack审校整理,希望能让大家对FFmpeg有更深入了解。阅读上半部分内容请点击【阅读原文】


文 / 施雪梅


4. HEVC在RTMP中的扩展


为推进HEVC视频编码格式在直播方案中的落地,经过CDN联盟讨论,并和主流云服务厂商达成一致,规范了HEVC在RTMP/FLV中的扩展,具体修改内容见下。


4.1 FLV规范扩展


HEVC为视频编码格式,因此对FLV规范的扩展,只集中在Video Tag,其它部分,无任何改动。


4.1.1 支持HEVC的VideoTagHeader


扩展后的VideoTagHeader如下图所示(红色字体为新增内容):

 

图9. 支持HEVC的FLVTagHeader


修改点如下:


1.CodecID - 定义HEVC格式的值为12;

2.HEVCPacketType - 当CodecID == 12时,AVCPacketType为HEVCPacketType:

  • 如果HEVCPacketType为0,表示HEVCVIDEOPACKET中存放的是HEVC sequence header;

  • 如果HEVCPacketType为1,表示HEVCVIDEOPACKET中存放的是HEVC NALU;

  • 如果HEVCPacketType为2,表示HEVCVIDEPACKET中存放的是HEVC end of sequence,即HEVCDecoderConfigurationRecord;

3.CompositionTime - 当CodecID == 12时,同样需要CompositionTime。


4.1.2 支持HEVC的VideoTagBody


当CodecID为12时,VideoTagBody中存放的就是HEVC视频帧内容。

扩展后的VideoTagBody如下图所示(红色字体为HEVC新增内容):

 

图10. 支持HEVC的VideoTagBody


4.2 FFmpeg中的修改


我们已在FFmpeg的各个版本上提供相关的完整修改,具体参见:https://github.com/ksvc/FFmpeg,完整patch获取及相关说明见:https://github.com/ksvc/FFmpeg/wiki。


由第二章节的阐述可知,FLV的解复用和复用功能代码分别在libavformt/flvdec.c和libavformat/flvenc.c中,扩展后的修改也都集中在这两个文件。本节将在FFmpeg3.3的基础上,说明修改的关键点。


4.2.1 编码类型定义


libavformat/flv.h中按照VideoTagHeader中的CodecID定义了一组视频编码格式的枚举值,扩展后的枚举定义如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值