Enhanced-Rtmp支持H265
千呼万唤使出来,rtmp/flv算是有统一支持H265的国际版本。本文介绍一下:
- 现存rtmp/flv支持H265的方式;
- Enhanced-Rtmp协议如何支持H265;
- ffmpeg/obs/srs/media-server各个开源的实现;
- 国内方案与国外方案的兼容性问题;
1. rtmp/flv封装视频方式
准确的说,rtmp是传输协议,传输协议内部的封装是flv格式,其实我们所说的支持H265,是在flv封装格式里面支持H265编码数据。
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;
这里如果是H264,就是7。
- AVCPacketType: 8个bits,也就是一个字节,0: AVC sequence header; 1: AVC NALU
- CompositionTime: 3个字节(24bits),表示pts与dts的差值;
举例:
- 如果视频数据是H264的sequence header(也就是包含sps/pps的Avcc Header),就应该是0x17 00;
- 如果视频数据是H264的Iframe,就应该是0x17 01;
- 如果视频数据是H264的非Iframe,就应该是0x27 01
flv的标准中,只设定了H264的codecId为7,之后的flv标准就没在针对video的codecId进行增加,这也就是导致后面rtmp/flv没有支持H265的标准。
1.1. 国内rtmp/flv对H265的支持
随着国内前10年移动互联网对直播需求的增加,对高清画质的需求与日俱增,支持H265直播的需求很早就在各家CDN和云厂商成为top需求。
因此,国内云厂商和CDN厂商对H265很早就支持,支持的方式比较简单,就是自定义H265的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: H265(国内自定义H265的CodecID);
这样的自定义的好处:迅速解决了国内统一rtmp/flv支持H265的格式标准;国内的cdn厂家的服务都遵循CodecID=12来实现rtmp/flv直播服务。
举例:
- 如果视频数据是H265的sequence header,就应该是0x1c 00;
- 如果视频数据是H265的Iframe,就应该是0x1c 01;
- 如果视频数据是H265的非Iframe,就应该是0x2c 01
国内的多个开源也都遵循国内的H265标准:
但是,同样有其局限性:CodecID是自定义的,并且对CodecID只有4个bits的局限性没能解决,后面对新增的编码方式无法适用,如新增VP8,VP9, AV1,或未来的H266,扩展会很难。
国外为准的流媒体开源,并未支持CodecId=12为H265,如:
- ffmpeg: 未支持CodecId=12为H265;
- obs: 未支持CodecId=12为H265;
2. Enhanced-Rtmp
Enhanced-Rtmp公布支持H265的标准,彻底解决在rtmp/flv支持H265的编码。
2.1 Enhanced-Rtmp规范
Enhanced-Rtmp规范: 原文
flv对视频的封装格式, 原有V