编者按:很长时间以来,国内CDN都是通过“CodecID=0xC”的设置来实现H.265支持,但这未能彻底解决CodecID只有4个bits的尴尬,未来RTMP无法支持更多的编码标准。Enhanced-RTMP会彻底解决这一问题。如果你有兴趣分享自己的经验和思考,可以通过contribute@livevideostack.com联系我们。
文 / 小新快跑
千呼万唤使出来,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的差值;
举例:
如果视频数据是H.264的sequence header(也就是包含sps/pps的Avcc Header),就应该是0x17 00;
如果视频数据是H.264的Iframe,就应该是0x17 01;
如果视频数据是H.264的非Iframe,就应该是0x27 01
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