详解Enhanced-RTMP支持H.265

编者按:很长时间以来,国内CDN都是通过“CodecID=0xC”的设置来实现H.265支持,但这未能彻底解决CodecID只有4个bits的尴尬,未来RTMP无法支持更多的编码标准。Enhanced-RTMP会彻底解决这一问题。如果你有兴趣分享自己的经验和思考,可以通过contribute@livevideostack.com联系我们。

文 / 小新快跑

24150f332a8fa3dd1d5258941e6089d0.png

千呼万唤使出来,rtmp/flv算是有统一支持H.265的国际版本。本文将介绍:

  • 现存rtmp/flv支持H.265的方式;

  • Enhanced-RTMP协议如何支持H.265;

  • ffmpeg/obs/srs/media-server各个开源的实现;

  • 国内方案与国外方案的兼容性问题。

1. rtmp/flv封装视频方式

准确的说,RTMP是传输协议,传输协议内部的封装是flv格式,其实我们所说的支持H.265,是在flv封装格式里面支持H.265编码数据。

flv对视频的封装格式, 原有VideoTagHeader定义如下:

------------------------------------------------------------------------------------
| FrameType(4bits) | CodecID(4bits) | AVCPacketType(8bits)| CompositionTime(24bits)|
------------------------------------------------------------------------------------

其中:

  • FrameType: 4个bits, 1: keyframe, 也就是I帧; 2: inter frame, 非I帧,B帧或P帧;

  • CodecID: 4个bits,

1:JPEG (currently unused); 

2:Sorenson H.263; 

3:Screen video; 

4:On2 VP6; 

5:On2 VP6 with alpha channel; 

6:Screen video version 2; 

7:AVC;

这里如果是H.264,就是7。

  • AVCPacketType: 8个bits,也就是一个字节,0: AVC sequence header; 1: AVC NALU

  • CompositionTime: 3个字节(24bits),表示pts与dts的差值;

举例:

  1. 如果视频数据是H.264的sequence header(也就是包含sps/pps的Avcc Header),就应该是0x17 00;

  2. 如果视频数据是H.264的Iframe,就应该是0x17 01;

  3. 如果视频数据是H.264的非Iframe,就应该是0x27 01

  4. flv的标准中,只设定了H.264的codecId为7,之后的flv标准就没在针对video的codecId进行增加,这也就是导致后面rtmp/flv没有支持H.265的标准。

1.1. 国内rtmp/flv对H.265的支持

随着国内前10年移动互联网对直播需求的增加,对高清画质的需求与日俱增,支持H.265直播的需求很早就在各家CDN和云厂商成为top需求。

因此,国内云厂商和CDN厂商对H.265很早就支持,支持的方式比较简单,就是自定义H.265的CodecID=0xC,也就是CodecID值为12。

1: JPEG (currently unused); 

2: Sorenson H.263; 

3: Screen video; 

4: On2 VP6; 

5: On2 VP6 with alpha channel; 

6: Screen video version 2; 

7: AVC;

12: H.265(国内自定义H265的CodecID);

这样的自定义的好处:迅速解决了国内统一rtmp/flv支持H.265的格式标准;国内的CDN厂家的服务都遵循CodecID=12来实现rtmp/flv直播服务。

举例:

  • 如果视频数据是H.265的sequence header,就应该是0x1c 00;

  • 如果视频数据是H.265的Iframe,就应该是0x1c 01;

  • 如果视频数据是H.265的非Iframe,就应该是0x2c 01

国内的多个开源也都遵循国内的H.265标准:

  • SRS(https://github.com/ossrs/srs)

  • media-server(git@github.com:ireader/media-server.git)

  • ffmpeg_rtmp_h265 自定义补丁(https://github.com/runner365/ffmpeg_rtmp_h265)

但是,同样有其局限性:CodecID是自定义的,并且对CodecID只有4个bits的局限性没能解决,后面对新增的编码方式无法适用,如新增VP8,VP9, AV1,或未来的H.266,扩展会很难。

国外为准的流媒体开源,并未支持Co

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值