如何支持Enhanced RTMP H.265(HEVC)
在实时音视频传输中,H.264长期占据主流,但随着视频质量要求的不断提高和带宽压力的加大,H.265(HEVC)作为下一代视频编码标准逐渐崭露头角。
在这种背景下,我们顺应行业发展趋势,成功集成了对Enhanced RTMP H.265(HEVC)支持,通过协议扩展和编码解码优化,提升了直播视频质量,同时降低了带宽消耗。
今天,我们将从spec解读的角度出发,深入探讨如何在RTMP推送端与播放端支持Enhanced RTMP H.265(HEVC),并分享其中的技术要点与实现策略。
【一】Enhanced RTMP H.265(HEVC):技术规格解读
1. RTMP协议的扩展:
RTMP(Real-Time Messaging Protocol)作为一种历史悠久的流媒体协议,在其标准版中并不支持H.265编码的视频流。而Enhanced RTMP正是对原有RTMP协议的扩展,主要目的是引入对H.265(HEVC)等新视频编码标准的支持。
关键改进:
-
支持HEVC编码:Enhanced RTMP通过引入新的视频编码标识符,使得RTMP可以支持H.265视频流的传输。具体而言,RTMP的数据包头部会新增一个FourCC标识符,用于标识视频编码格式,包括HEVC(H.265)的支持。
-
Metadata扩展:Enhanced RTMP还增加了Metadata功能,用于传输与视频内容相关的元数据。例如,视频的色彩信息、HDR信息等,这对于高质量视频流的传输至关重要。
-
视频包格式调整:为了适配HEVC编码,RTMP的视频包格式也进行了扩展。比如,CodecID字段被重新定义,支持HEVC编码视频流的标识,同时添加了对新的视频帧类型和视频帧标记的支持。
H.265编码的优势:
-
更高的压缩效率:H.265相比H.264提供了更高的压缩比,在相同画质下,H.265能减少**50%**的带宽消耗;
-
更好的画质表现:H.265在低比特率情况下仍能提供更清晰的图像,尤其适用于4K直播和**高动态范围(HDR)**内容。
【二】如何支持Enhanced RTMP H.265的实现策略
技术实现
本文以大牛直播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);
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);
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';//....
RTMP播放端,对应的sample判断代码如下:
/** Author:daniusdk.com */
bool is_ex_header;if (p[0]&0x80)is_ex_header = true;
elseis_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处理}
}
启动Windows平台窗体采集,设置H.265硬编码,输入RTMP推流URL,实现Enhanced RTMP推送,播放端拉流播放,整体延迟如下:
【三】挑战与解决方案
在实现Enhanced RTMP H.265支持的过程中,存在若干挑战:
-
解码复杂度:H.265的解码复杂度比H.264高,如何在低延迟的情况下完成高效解码是关键。大牛直播SDK通过硬件加速解码和优化解码流程,确保在高负载情况下依然能保持低延迟播放。
-
带宽适应性:由于H.265的高压缩率,视频质量和带宽之间的平衡尤为重要。SDK通过自适应码率控制,动态调整视频流的质量,确保在网络波动的情况下依然保持流畅播放。
【四】结语:直播行业的技术革新
“推流与播放,都是艺术;把技术做到极致,才是我们的功夫。”
我们不仅在RTMP推送端和播放端实现了对H.265(HEVC)的支持,而且通过Enhanced RTMP协议扩展了视频编码的边界。我们深知,超低延迟、稳定性和兼容性是直播行业中的三大核心要求,在H.265的支持下,帮助各行业突破带宽瓶颈,提升视频质量,降低成本。
未来,随着更多编码标准的兴起,我们将继续秉持“技术领先”的原则,不断推动音视频技术向更高标准、更低延迟的方向前进。