HEVC编码格式的推出为此带来了突破点。对于直播而言,大部分推拉流协议是基于RTMP的,因此本文将主要介绍如何在RTMP协议中增加对HEVC视频编码格式的支持。 HEVC在RTMP中的扩展 为推进HEVC视频编码格式在直播方案中的落地,经过CDN联盟讨论,并和主流云服务厂商达成一致,规范了HEVC在RTMP/FLV中的扩展,具体修改内容见下。 4.1 FLV规范扩展 HEVC为视频编码格式,因此对FLV规范的扩展,只集中在Video Tag,其它部分,无任何改动。 扩展后的VideoTagBody如下图所示(红色字体为HEVC新增内容): 图10. 结束语 本文简单介绍了如何在FFmpeg中扩展rtmp协议对HEVC编码格式的支持,而要将HEVC应用于直播整体方案,除推流端和播放端要提供相应能力外,源站、CDN、转码服务同样都需要提供这种能力。
不久前刚实现SkeyeRTMPPusher扩展支持h265推送,当时在网上也查找了很多资料,发现都不尽详细,而官方也没有更新对HEVC(H265,后文统称HEVC)tag的支持,反正是走了不少弯路,当然 ,在广大网友以及ffmpeg代码的帮助下我最终实现了通过SkeyeRTMPPusher推送HEVC视频帧数据到SkeyeSMS,这里我将把实现过程详细的记录下来,供广大网友参考。 首先, RTMP头部信息封装并没有定义HEVC,我们采用CDN联盟的HEVC扩展标准,将HEVC的VideoTagHeader定义为12,详见下图: 图片 然后,我们在H264封装的基础上进行改进,以支持 HEVC头部的封装,而HEVC头有 SPS PPS VPS,我们参考ffmpeg的HEVCDecoderConfigurationRecord结构对metadata进行封装,该结构体代码如下: typedef 0x1C:0x17;// 1:Iframe 7:AVC 12:HEVC if (m_bWaitingKeyFrame) { m_bWaitingKeyFrame = false;
鉴于广大码友对上一篇文章RTMP推送扩展支持HEVC(H265)的Metadata数据结构还存在不清楚的地方,这里对RTMP推送Metadata的结构进行详解。 SPS 40| 01 PPS num: 1 41| 00 05 PPS size: 5字节 42| 68 NAL type: PPS H.265/HEVC metadata语法 参照HEVCDecoderConfigurationRecord:(最小长度23字节) 图片 HEVC metadata 示例 图片 metadata 如上 pps data memcpy(&body[i],lpMetaData->Pps,lpMetaData->nPpsLen); i= i+lpMetaData->nPpsLen; 从上一篇文章RTMP 推送扩展支持HEVC(H265)我们了解了HEVCDecoderConfigurationRecord结构: typedef struct HEVCDecoderConfigurationRecord
How to Push HEVC via RTMP by OBS Written by Winlin, chundonglinlin OBS 29.1支持RTMP的HEVC,所以你现在可以用OBS和SRS 现在,RTMP支持HEVC出新标准了,详见Enhanced RTMP。这个标准定义了一个新的codec ID,用于HEVC,即fourCC hvc1, OBS和SRS都支持这个标准。 What’s Next FFMpeg不支持RTMP的HEVC,但是一些维护者正在努力中了。 你可以给FFmpeg打补丁,支持RTMP的HEVC,参考FFmpeg HEVC SRS支持HEVC WebRTC,支持的是Safari浏览器,但SRS不支持RTMP转WebRTC,我们正在开发中了。 OBS HEVC软件编码器性能太差,编不动,会导致卡顿。 Conclusion 这篇文章介绍了如何用OBS推送HEVC RTMP流。
不久前我们已经在RTMP推送端扩展支持了HEVC(H.265 后文统称H265)编码格式,但是,由于RTMP官方指定的协议格式已经不再更新,官方的播放器的Flash播放器并不支持H265格式的编码数据进行解码播放 ;现在,我们需要在播放器端解析RTMP流时对H265编码格式进行扩展支持。 首先,我们可以通过扩展ffmpeg,让其支持拉H265封装的RTMP流进行解码播放,我们可以通过金山云对FFmepg的扩展支持H265来解决。 扩展支持HEVC(H.265) e_FlvVideoCodecId_Hevc = 12, }; enum FlvCodeId { FlvCodeId_Jpeg = 1, FlvCodeId_Sorenson 扩展支持HEVC(H.265) FlvCodeId_Hevc = 12, }; 2.
RTMP要支持H.265,大家约定俗成的做法是扩展flv协议,CDN厂商携手给出的解决方案是给flv的videotag CodecID增加一个新类型(12)来表示h265(hevc),和h264不同的地方是要解析 技术实现本文以大牛直播SDK的Windows平台RTMP直播推送和RTMP直播播放模块为例,考虑到老的扩展CodecID 12的场景依然使用,我们添加了个设置接口:RTMP推送端,对应文件为SmartPublisherSDK 1,那就是扩展头,Enhanced-Rtmp格式。 RTMP推送端生成HEVC的FLV VideoTagHeader,对应的sample判断代码如下:/** Author:daniusdk.com*/*p = 0x80;if (key)*p |= (1< 技术总结鉴于目前RTMP扩展265这块,大多还是用的老的CodecID设置为12的模式,如果需要支持新的Enhanced RTMP,除了推送端和播放端外,RTMP服务端也需要做响应的调整,来适配这种情况
这是一个专栏,从视频编码最基础的知识到HEVC技术细节的点点滴滴,记录了我研究生对于视频编码的理解。这个系列包含了下面的内容。 视频压缩的基本概念,这一章对视频压缩做一个简介,视频压缩的方法与概念,以及自视频发展开始到现在最新的HEVC的视频压缩的原理性问题。 HEVC介绍,这一张正式开始对HEVC开始进行说明,包括HEVC视频编码是怎么由最初的MPEG时代到H.261,然后一步步地到最新的高效视频编码的,HEVC编码器的每一个部分在这一章节也会有一个详细的概念介绍 ,为以后在每一章的介绍打下基础,从下一章开始就是对HEVC的每一个模块的介绍了。 环滤波 标准语法 熵编码 并行技术 码率控制 HEVC编码器的结构就是如上面所说的这些环节。
这种设计导致 RTMP 长期以来只能绑定 H.264,难以扩展到 HEVC 等新一代编码标准。Enhanced RTMP 规范 在不破坏现有结构的前提下,引入了以下关键机制:1. 双模式支持的背景在 Enhanced RTMP HEVC 出台之前,国内主要 CDN 厂商为了降低带宽成本,已经推出过 RTMP-H.265 扩展方案。 避免厂商绑定,保证兼容性在 Enhanced RTMP HEVC 出台前,国内 CDN 厂商各自实现的 RTMP-H.265 扩展缺乏统一标准: 腾讯云可能用自定义 CodecID 解析; 另一些厂商可能在 大牛直播SDK的“双模式支持”保证了开发者 无需修改业务逻辑,就能平滑过渡: 短期:继续兼容国内 CDN 的扩展模式; 长期:无缝升级到 Enhanced RTMP HEVC 国际标准。 大牛直播SDK作为行业内少数完成 双模式适配 的商业播放器 SDK,已经实现: 国内扩展模式(CDN 厂商联盟版 RTMP-H.265) 国际标准模式(Enhanced RTMP HEVC) 的 全面兼容与共存
但随着 H.265/HEVC 的普及,产业提出了两种扩展方案: RTMP 扩展 H.265:在 VideoTag 中通过扩展 CodecID 表示 HEVC,兼容 H.264 的封装方式; Enhanced RTMP 扩展 H.265 的封装业界将 CodecID 扩展为 12,标识 HEVC。 Enhanced RTMP HEVC 的演进相比单纯的扩展,Enhanced RTMP HEVC 在以下方面更严谨: 显式 NALU 类型映射表:确保 VPS、SPS、PPS、IDR、CRA 等帧能被准确识别 整体架构分为四层: 输入与协议层 标准 RTMP 协议栈 RTMP 扩展 H.265 / Enhanced RTMP HEVC 支持 自动重连与多路 URL 切换 解复用与缓存层 支持 AAC 在 H.265/HEVC 普及的背景下,通过 RTMP 扩展 H.265 与 Enhanced RTMP HEVC 的演进,RTMP 不仅延续了传统优势,还成功拓展到 低延迟、高压缩比的新一代实时视频链路
AVC到HEVC 国际视频标准化组织绝对算得上是一个勤奋、高产的机构,近二十年的时间,输出了一系列高水准音视频编码标准。 图 2 用于设备异构环境下的SVC方案 但无论是高科技的SVC还是噱头味十足的MVC都只是H.264/AVC的特性扩展,即适应特殊的视频应用场景,两者并未在信源编码效率上有所提升。 与此同时,那些性能拉风的编码提案被纳入TMuC(Test Model under Consideration),成为HEVC最终方案的候选,在随后的时间内被不断测试、挑战和改进。 2012年春天,本文导读开头的一幕上演:其硬件芯片高调亮相MWC 2012,HEVC第一次向世人昭告其存在。——而且,是结结实实地踩在其前任者的肩膀上。 2012年春天,本文导读开头的一幕上演:其硬件芯片高调亮相MWC 2012,HEVC第一次向世人昭告其存在。——而且,是结结实实地踩在其前任者的肩膀上。
H265 HM开源软件 http://hevc.hhi.fraunhofer.de/ 由德国fraunhofer研究生负责开发,为HEVC HM参考软件HM维护单位,相当于HEVC标准的C++实现。 代码下载 https://hevc.hhi.fraunhofer.de/svn/svn_HEVCSoftware/ X265开源库也是基于H265 HM(H265 test Model)开发的开源库
这正是 大牛直播SDK(SmartMediaKit) 的定位:提供面向机器人与边缘智能的低延迟 RTSP 播放/服务、内网公网 RTMP 分发(含 Enhanced RTMP + HEVC/H.265) RTMP + HEVC/H.265,在同等码率下更高画质或更低带宽; 轻量转发/小型服务:端侧或边缘即可完成发流/转封装/转发,减少对集中式流媒体的依赖; GB28181 对接:适配政企安防汇聚、 /旁路观看公网规模与可达性RTMP 播放/推流Enhanced RTMP + HEVC:同码率更清晰或降码率保画质政企安防汇聚专网/公网混合兼容对接GB28181目录/注册/订阅/上墙/报警联动端侧多路接入混合简化部署轻量 [视频格式]支持RTMP扩展H.265和Enhanced RTMP H.265,H.264; [音频格式]支持AAC/PCMA/PCMU/SPEEX(RTMP); [H.264/H.265软解码]支持 以 大牛直播SDK(SmartMediaKit) 为基座,通过 RTSP 低延迟/轻量服务/RTMP 公网分发(Enhanced RTMP + HEVC)/GB28181 对接/录制与回溯 等模块化能力
HEVC 学习简介 HEVC(high efficient advanced code)(即H.265),是继AVC(advanced video code)(H.264)以后的新一代视频编码技术。 商用领域:高清及超高清(4K,8K)领域 实现目标:HEVC目标在H.264/AVC 的基础上,对高分辨率/高保真的视频图像压缩效率提高一倍,也就是在保证相同 视频图像质量的前提下,视频流的码率减少50% 相关资源网站: 第三方参考软件下载:http://x264.fushizen.eu/builds/hevc-hm/ 中国HEVC论坛 http://www.oschina.net/p/hevc HEVC 详细介绍:http://www.itu.int/rec/T-REC-H.265-201304-P/en, 官方 HEVC参考软件:https://hevc.hhi.fraunhofer.de/svn/svn_HEVCSoftware 严顺卿,HEVC帧内预测快速模式选择算法研究【硕士论文】【上海交通大学】 4. 毕厚杰,王健.新一代视频压缩编码标准——H.264/AVC(第二版).人民邮电出版社1,2009年11月.
注意,使用ffmpeg命令把视频文件推流给SRS时,要注意区分FFmpeg的版本,因为FFmpeg从6.1开始才给RTMP协议支持HEVC、VP9、AV1这三种视频编码器,所以FFmpeg 6.0和更早的版本只能以 ://127.0.0.1/live/test而下面这种以HEVC格式(即H.265)向SRS推流的命令对于FFmpeg 6.0和更早的版本来说是错误的:ffmpeg -re -stream_loop - 1 -i "/usr/local/src/test/2018s.mp4" -vcodec hevc -f flv rtmp://127.0.0.1/live/test只有把FFmpeg升级到6.1或更高版本 ,才能以HEVC格式把视频文件推流给SRS。 :2.17.1'可见以上配置不但导入了exoplayer的主包,还导入了rtmp的扩展包。
在上一篇 SkeyeRTMPClient拉取RTMP流扩展支持HEVC(H.265)解决方案 中关于HEVCDecoderConfigurationRecord结构解析的讲解存在一些表述上不清楚的地方, 在SkeyeRTMPPusher扩展支持H265的解决方案讲述时。 我们对Metadata结构进行过详解,大家可以回顾一下这篇文章RTMP推送扩展支持HEVC(H265)之Metadata结构填写详解,重点来了,因为正常情况下,我们只需要从MetaData中取出对我们解码有用的数据头 扩展支持HEVC(H.265) [4/18/2019 SwordTwelve] typedef struct _Parser_HEVCDecoderConfigurationRecord { uint8 扩展支持HEVC(H.265) [4/18/2019 SwordTwlve] typedef struct _Parser_HVCCNALUnitArray { uint8_t NAL_unit_type
在之前两篇关于SkeyeRTMPClient扩展支持HEVC(H.265)解决方案的文章中,我们已经完成了对H265的支持,本文主要阐述将H26和H265支持兼容起来,实现不同视频编码格式的自适应兼容适配 数据帧头部判断 根据FLV/RTMP扩展支持H265标准,支持HEVC的VideoTagHeader定义如下图所示: 图片 即 当CodecID == 12时,AVCPacketType为HEVCPacketType 中存放的是HEVC NALU; 如果HEVCPacketType为2,表示HEVCVIDEPACKET中存放的是HEVC end of sequence,即HEVCDecoderConfigurationRecord 视频数据体帧数据nalu类型判断 根据FLV/RTMP扩展支持协议标准,支持H265的VideoTagBody定义如下, 扩展后的VideoTagBody如下图所示(红色字体为HEVC新增内容): 图片 processlen; return 0; } 至此,SkeyeRTMPClient对H264和H265的兼容适配就完成了,我们可以通过SkeyeRTMPClient拉取任意编码格式为H264或者H265的RTMP
最近在做一个项目,需要把图像用HEVC的HM压缩一次,但是在网上查了好久,貌似HM不能直接对JPG或者PNG等格式直接进行压缩。
鉴于直播的大部分推拉流协议是基于RTMP的,本文主要介绍如何在RTMP协议中增加对HEVC视频编码格式的支持,其他协议或私有协议,可参考本文自行添加。 此外,除推流端和播放端要做出修改,用到的RTMP Server部分也要同步进行相应修改,才能够保证HEVC在直播中的正常使用。 但官方FFmpeg中没有对RTMP FLV中进行HEVC的相关扩展,这是因为FLV与RTMP是Adobe发行的标准,而Adobe暂停了对FLV与RTMP标准的更新,HEVC的相关扩展属于私有标准,所以为了减少国际上不必要的不兼容性麻烦 ,官方FFmpeg并不会对FLV与RTMP中扩展HEVC进行支持。 经过CDN联盟讨论,我们制定了相关的协议扩展规范,并在FFmpeg中完成了相关代码实现。 本文后面介绍的就是如何在FFmpeg中,对RTMP进行HEVC扩展。
Background 先看看SRS 6.0支持的主要功能: • HEVC:支持了RTMP、SRT、FLV、GB等协议的HEVC,HLS和RTC部分支持。 • SRS1:支持RTMP Edge Cluster。 • SRS1:支持DVR录制功能。 • SRS1:支持RTMP和HLS协议。 Next GB外部SIP服务,意味着你完全可以使用自己的SIP服务,支持完善的SIP功能,在实际的应用场景中使用SRS完成GB系统的搭建,灵活扩展系统的能力。 预计SRS 7.0的功能包括: • 支持完善的Enhanced RTMP协议,包括AV1和Opus等新标准,以及HDR和RTMP 301等新协议。 • 其他方向比如Apple VisionPro MV-HEVC,多线程,WebRTC集群能力等。 欢迎一起贡献。
第一方面的技术是先进的编码器,这方面Apple公司对HEVC推动作用显著。与H.264相比,HEVC可以降低传输成本,同时提高观众的体验质量。 图1 HEVC涉及的许多实际编码技术与AVC相同,但做了多方面的扩展。例如,当搜索帧间冗余时,AVC呈现9个方向向量的选择,而HEVC提供33个向量的选择。 与几乎能在任何地方播放的H.264不同,支持HEVC播放的领域还比较有限,目前,HEVC主要用于向智能电视和类似的OTT和STB设备以及4K或UHD内容提供视频。 RTMP到HTTP的发展有几个原因,首先,RTMP需要在播放器和服务器之间建立持久连接,这意味着除标准HTTP Web服务器外,还需要运行特殊服务器。 使用JIT打包解决方案可以扩展对未升级的旧设备的支持,并继续支持无法升级的旧设备。这可以确保观众数量不受限制,任何想要观看的人都可以在他们想要的任何设备上观看。