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

这与this question有关,因为答案仅在少数情况下有效。

示例

我正在使用以下命令从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
    可用的here文档(在第7.2章中名为“SIP视频配置文件最佳做法”,用于配置文件级别ID状态):



    同一文档对sprop-parameter-sets声明了以下内容:



    问题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

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

    最佳答案

    含义和主要区别:

    如您在profile-level-id的定义中所见,它具有默认值,因此可以在信令协商中省略。此参数中包含的字符串位于hexadecimal format and it has 3 bytes中,该字符串将通知解码器有关profile,约束和将用于发送数据的level的信息。此设置定义了几个参数,例如比特率,分辨率,数据包类型...

    可以将参数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数据包,您将在某些数据包中看到此值的说明。

    关于video - sprop-parameter-sets或profile-level-id是解码H264所需的SDP参数吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20634476/

    10-11 08:03