You need to enable JavaScript to run this app.
导航
视频媒体特性
最近更新时间:2024.02.06 18:21:35首次发布时间:2022.03.11 19:36:52

超低延时直播视频编码技术支持 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 协议商定:

  • 使用 PT=96 代表 H.264;
  • 使用 PT=98 代表 H.265。

H.264 编解码支持

... 
a=rtpmap:96 H264/90000
a=fmtp:96 BFrame-enabled=1;
...

H.265 编解码支持

...
a=rtpmap:98 H265/90000
a=fmtp:98 BFrame-enabled=1;
...

视频 B 帧支持

SDP 视频 B 帧协商

客户端需要在 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 帧。

  1. OfferSDP中BFrame-enabled=0,源流带 B 帧,则服务器把源流B帧去除后再转发客户端。
  2. OfferSDP中BFrame-enabled=0,源流不带 B 帧,则服务器把源流直接转发客户端。
  3. OfferSDP中BFrame-enabled=1,源流带 B 帧,则服务器把源流直接转发客户端。
  4. OfferSDP中BFrame-enabled=1,源流不带 B 帧,则服务器把源流直接转发客户端。

视频 B 帧时间戳计算

视频 B 帧时间戳计算方式有 2 种。

  • 建议规范 1: 每个 RTP 包的 rtp timestamp 携带当前帧数据的采样时间即 PTS,解码顺序附着于 SequenceNumber 顺序, 客户端不能直接计算出 DTS 的值,此种规范下在有 B 帧的时候不便于快速解码和出帧。
  • 建议规范 2:使用 RTP 私有扩展头携带 CTS 值,每个 RTP 包的 RTP timestamp 携带当前帧数据的采样时间即 PTS, 每一帧首个 RTP 包和 VPS/SPS/PPS 包通过 RFC5285-Header-Extension 扩展头携带该帧的 CTS 值,通过 DTS = PTS - CTS * 90 公式计算出当前帧的解码时间戳。SDP extmap 示例如下所示。
...
a=rtpmap:96 H264/90000
a=fmtp:96 BFrame-enabled=1;
a=extmap:7 rtp-hrdext:video:CompositionTime
...
  • 以上两种方式可以兼容,当 offer sdp 有相应 extmap rtp-hrdext 字段时采用规范 2,否则采用规范 1。
  • RTP 扩展头详细说明请参见 附录