超低延时直播视频编码技术支持 VP8、VP9、H.264 和 H.265 等多种编解码技术;采用 H.264 和 H.265 编码的视频序列支持 B 帧压缩,可以相对 P 帧带来更优秀的压缩效能,因此本白皮书建议规范采用 H.264 和 H.265 标准的 RTP 封装视频(MPEG-4 Visual RTP 封装)进行描述。
MPEG-4 视觉 RTP 负载格式封装如下所示。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P|X| CC |M| PT | sequence number | RTP +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | timestamp | Header +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | synchronization source (SSRC) identifier | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | contributing source (CSRC) identifiers | | .... | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | | RTP | MPEG-4 Visual stream (byte aligned) | Pay- | | load | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | :...OPTIONAL RTP padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中,RTP 数据头中包含负载类型 payload type(PT)。RFC3551 标准在 Registering Additional Encodings 章节中,指定了部分音视频编码的 PT,并建议使用。同时,RFC3551 中也预留了部分取值,其他未列出编码所使用的 PT 建议在 96~127 的范围内通过协商确定,例如,通过 SDP 协议商定:
... a=rtpmap:96 H264/90000 a=fmtp:96 BFrame-enabled=1; ...
... a=rtpmap:98 H265/90000 a=fmtp:98 BFrame-enabled=1; ...
客户端需要在 offer sdp 中添加 B 帧相关信息,实现 B 帧 timestamp 非单调递增的处理逻辑,后台则需要实现相应 B 帧 timestamp 封装逻辑。SDP B 帧协商示例如下所示。
... a=rtpmap:96 H264/90000 a=fmtp:96 BFrame-enabled=1;level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f ...
SDP 中的 BFrame-enabled 代表客户端是否支持解码 B 帧。不代表服务端是否支持发送 B 帧。
视频 B 帧时间戳计算方式有 2 种。
... a=rtpmap:96 H264/90000 a=fmtp:96 BFrame-enabled=1; a=extmap:7 rtp-hrdext:video:CompositionTime ...