如何在RTMP推送端和RTMP播放端支持Enhanced RTMP H.265(HEVC)

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 时隔多年,在Enhancing RTMP, FLV With Additional Video Codecs And HDR Support(2023年7月31号正式发布)官方规范出来之前,如果RTMP要支持H.265,大家约定俗成的做法是扩展flv协议,CDN厂商携手给出的解决方案是给flv的videotag CodecID增加一个新类型(12)来表示h265(hevc),和h264不同的地方是要解析HEVCDecoderConfigurationRecord,从HEVCDecoderConfigurationRecord中解析出vps, sps, pps. 有了vps, sps, pps,

技术背景

时隔多年,在Enhancing RTMP, FLV With Additional Video Codecs And HDR Support(2023年7月31号正式发布)官方规范出来之前,如果RTMP要支持H.265,大家约定俗成的做法是扩展flv协议,CDN厂商携手给出的解决方案是给flv的videotag CodecID增加一个新类型(12)来表示h265(hevc),和h264不同的地方是要解析HEVCDecoderConfigurationRecord,从HEVCDecoderConfigurationRecord中解析出vps, sps, pps. 有了vps, sps, pps, 就可以解码。

遗憾的是,尽管CodecID可以自定义,但CodecID只有4个bits,增加H.265尚可,如果后续再新增VP8、VP9、 AV1甚至H.266就很尴尬,这种尴尬持续了数年,直到官方发布了 Enhancing RTMP新的规范。值得欣慰的是,SRS等开源组织在服务侧第一时间进行了适配兼容。

技术实现

本文以大牛直播SDK的Windows平台RTMP直播推送和RTMP直播播放模块为例,考虑到老的扩展CodecID 12的场景依然使用,我们添加了个设置接口:

RTMP推送端,对应文件为SmartPublisherSDK\nt_smart_publisher_sdk.h:

   /*
        * disable enhanced RTMP, SDK默认是开启enhanced RTMP的
        * value: 1:disable, 0:enable
        */
        NT_UINT32(NT_API *DisableEnhancedRTMP)(NT_HANDLE handle, NT_INT32 value);

image.gif

RTMP播放端,对应文件为SmartPlayerSDK\smart_player_sdk.h:

/*
        * disable enhanced RTMP, SDK默认是开启enhanced RTMP的
        * value: 1:disable, 0:enable
        */
        NT_UINT32(NT_API *DisableEnhancedRTMP)(NT_HANDLE handle, NT_INT32 value);

image.gif

Enhanced RTMP针对flv原有VideoTagHeader中FrameType(4bits)做了如下调整:

| IsExHeader(1bit)FrameType(3bits) |

VideoTagHeader的第一个字节的第0位来判断是否是Enhanced RTMP格式,如果这一位是1,那就是扩展头,Enhanced-Rtmp格式。

RTMP推送端生成HEVC的FLV VideoTagHeader,对应的sample判断代码如下:

/*
* Author:daniusdk.com
*/
*p = 0x80;
if (key)
    *p |= (1<<4);
else
    *p |= (2 << 4);
 
if (pts != dts)
    *p |= 1;
else
    *p |= 3
 
p++;
 
*p++ = 'h';
*p++ = 'v';
*p++ = 'c';
*p++ = '1';
 
//....

image.gif

RTMP播放端,对应的sample判断代码如下:

/*
 * Author:daniusdk.com 
 */
bool is_ex_header;
if (p[0]&0x80)
    is_ex_header = true;
else
    is_ex_header = false;
 
if (is_ex_header) {
    auto video_fourcc = (p[1] << 24)|(p[2] << 16)|(p[3] << 8)|p[4];
    if (HEVC == video_fourcc) {
       // hevc处理
    }else if (VP9 == video_fourcc) {
       // vp9处理
    }else if (AV1 == video_fourcc ) {
       // AV1处理
    }
}

image.gif

启动Windows平台窗体采集,设置H.265硬编码,输入RTMP推流URL,实现Enhanced RTMP推送,播放端拉流播放,整体延迟如下:

image.gif

可以看到,尽管开启了Enhanced RTMP,整体延迟还在毫秒级。

技术总结

鉴于目前RTMP扩展265这块,大多还是用的老的CodecID设置为12的模式,如果需要支持新的Enhanced RTMP,除了推送端和播放端外,RTMP服务端也需要做响应的调整,来适配这种情况,好在SRS等一线开源组织已经做了适配,我们也自己调整了nginx的代码,做了简单的测试,整体延迟满足预期,感兴趣的开发者可以单独跟我交流。

相关文章
|
6月前
|
编解码 缓存 数据安全/隐私保护
浅析 HLS 流媒体协议
【2月更文挑战第13天】浅析 HLS 流媒体协议
527 5
浅析 HLS 流媒体协议
|
12天前
|
编解码 监控 网络协议
如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频
本文详细介绍了如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频。内容涵盖环境搭建、编码配置、服务器端与客户端实现等方面,适合视频监控系统和直播平台等应用场景。通过具体命令和示例代码,帮助读者快速上手并实现目标。
41 6
|
15天前
|
编解码 监控 网络协议
HLS 和 RTSP 的优势
【10月更文挑战第25天】HLS和RTSP各自的优势使其在不同的应用场景中发挥着重要作用。HLS适用于需要广泛兼容性、自适应码率和简单部署的场景,如在线视频点播、直播等;而RTSP则更适合对实时性、精确播放控制和互操作性要求较高的专业级实时流媒体应用。了解它们的优势有助于根据具体的项目需求选择最合适的流媒体传输协议。
36 6
|
编解码 监控 网络协议
干货:如何实现RTSP推送H.264、RTSP推送H.265(hevc)
rtsp推送相关的资料和测试软件比较少,本文介绍rtsp推送相关信令和测试效果: 1. rtsp推送流程. 主要分两部分:第一部分先发送信令;第二部分发送rtp包。
540 1
|
编解码 开发工具 开发者
如何支持RTSP播放H.265(HEVC)流
随着H.265的普及,越来越多的开发者希望大牛直播SDK能支持低延迟的RTSP H.265播放,并分享相关经验: 实现思路: 对rtsp来说,要播放h265只要正确解析sdp和rtp包即可. 下面对这些相关内容做一些介绍.
445 1
|
存储 编解码 开发工具
RTMP/RTSP推送端和RTMP/RTSP播放端录像设计探讨
好多开发者认为,无论是RTSP/RTMP推送端还是RTSP/RTMP播放端,涉及到录像,只要2个接口足矣:开始录像、停止录像。
100 2
|
编解码 Android开发 iOS开发
如何推送和播放RTMP H265流 (RTMP HEVC)
rtmp 播放h265 首先要扩展flv协议,国内常用扩展方式是给flv的videotag.codecid增加一个新类型(12)来表示h265(hevc),其他和h264规则差不多,另外和h264不同的地方是要解析HEVCDecoderConfigurationRecord,从HEVCDecoderConfigurationRecord中解析出vps, sps, pps. 有了vps, sps, pps, 就可以解码。
415 0
|
Web App开发 编解码 网络协议
网页端WebRTC推流转换为RTMP/GB28181等其他直播流协议
网页端WebRTC推流转换为RTMP/GB28181等其他直播流协议
364 0
|
编解码 Linux 开发工具
C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播
C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播
279 0
|
Web App开发 编解码 移动开发
秒懂流媒体协议 RTMP 与 RTSP
RTMP 与 RTSP 是比较常见的两种流媒体协议,那么什么是RTMP?什么是RTSP?它们两之间有什么区别?使用的时候应该如何选择?
836 1
秒懂流媒体协议 RTMP 与 RTSP

热门文章

最新文章