8

我试图了解 SDP 中能够从 RTP 数据包中解码 H264 所需的参数是什么。

这与这个问题有关,因为该问题的答案仅在少数情况下有效。

例子

我使用以下命令从 VLC 流式传输。

vlc -vvv sample_video/big_buck_bunny_480p_h264.mov --sout '#transcode{vcodec=h264,vb=700,fps=20,scale=0.25,acodec=none}:rtp{dst=10.5.110.117,port=5004,ttl=1}'

这会将视频转码为:

  • 比特率:700kbps
  • 帧率:每秒 20
  • 分辨率:原版的25%

接收器正确地接受并解释带有以下 SDP 文件的流(删除第一行,它只是一个名称)。

//test.sdp
c=IN IP4 10.5.110.117
m=video 5004 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=640014;sprop-parameter-sets=Z2QAFKzZQ0R+f/zBfMMAQAAAAwBAAAAKI8UKZYA=,aOvssiw=;

运行命令:vlc test.sdp

此处提供的文档在第 7.2 章中命名为SIP Video Profile Best Practices for profile-level-id states:

配置文件级别 ID

虽然在 RFC 6184 中指定为可选(所有参数一样),但“profile-level-id”参数是编解码器设置的基础,也是指定任何其他参数所必需的。因此,所有的实现都应该在他们的 SDP 中包含这个参数,并且在接收到它时应该解释它。如果不包括在内,则默认值为 420010,如 RFC 6184 中所指定。

同一文件对sprop-parameter-sets规定了以下内容:

sprop 参数集

H.264 允许在带内和带外发送序列和图片信息。SIP 视频实现应在带内发送此信息,符合 H.323 中流行的模型和绝大多数现有 SIP 视频实现,因此不应包含此参数。

问题 1

即使profile-level-id被移除,视频也会在接收器上正确解释。

//test.sdp
c=IN IP4 10.5.110.117
m=video 5004 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 sprop-parameter-sets=Z2QAFKzZQ0R+f/zBfMMAQAAAAwBAAAAKI8UKZYA=,aOvssiw=;

没有sprop-parameter-sets. _ _

问题 2

我一直在共享不同的 RTCP、SIP 和 SAP,而且 SDP通常不 包含sprop-parameter-sets.

问题

  • 请解释一下这两个参数的含义和区别
  • 根据上述问题的答案,解释问题中出现的对比
4

1 回答 1

13

含义和主要区别:

正如您在定义中看到的那样profile-level-id,它具有默认值,因此可以在信令协商中省略。此参数中包含的字符串是十六进制格式,它有 3 个字节通知解码器有关配置文件、约束和将用于发送数据的级别。此设置定义了几个参数,如比特率、分辨率、数据包类型......

该参数sprop-parameter-sets可以看作是解码您将要发送的数据的关键。它包含一些将用于编码数据的字节,因此您与接收器共享它,以便它可以解码视频数据包。它也可以从信令中省略,但它们对于解码器是强制性的,因此它们也可以在带内发送。因此,如果您在 sdp 中省略它们,则需要在数据包中发送它们。接收方只有在收到此信息后才能对数据进行解码。

问题1:

如前所述,profile-level-id可以省略,它仍然有效,因为420010将使用默认值。唯一的区别是设置会有所不同,并且可能会影响视频质量。例如,默认值中的 42 引用约束基线配置文件 (CBP),而 SDP 中初始值中的 64 引用高配置文件 (HiP)。

视频在sprop-parameter-sets丢失时不起作用,可能是因为 vlc 不支持带内发送该数据,正如我上面解释的那样,这是强制性的。

问题2:

许多 SIP 实现支持sprop-parameter-sets带内发送,这就是您正在捕获的内容。检查 Wireshark 中的 h264 数据包,您将在某些数据包中看到该值的描述。

于 2013-12-18T11:27:24.860 回答