我想在流媒体视频应用中动态切换视频源。但是,不同的视频源具有独特的图像尺寸。我可以为每个视频源生成单独的SDP文件,但我想将它们组合成一个SDP文件,以便查看客户端可以在视频源更改时自动调整显示窗口的大小。以下是两个示例SDP文件:

640x480.sdp:

v=0
o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
s=VideoStream640x480
t=0 0
c=IN IP4 192.168.0.2
m=video 8000/2 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
a=control:trackID=1

960x480.sdp:

v=0
o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
s=VideoStream960x480
t=0 0
c=IN IP4 192.168.0.2
m=video 8000/2 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA=
a=control:trackID=1

如何将这些单个文件合并为一个SDP文件?

有帮助吗?

解决方案

两个sdp示例中的参数非常接近 - 流名称和sprop-parameter-sets不同。我假设你不关心流名称。如果您需要单独的sprop-parameter-sets且客户端支持标准井,则可以为每个分辨率使用单独的动态有效负载类型,并具有如下的单个SDP:

    v=0
    o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
    s=VideoStream640x480
    t=0 0
    c=IN IP4 192.168.0.2
    m=video 8000/2 RTP/AVP 96 97
    a=rtpmap:96 H264/90000
    a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
    a=rtpmap:97 H264/90000
    a=fmtp:97 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA=
    a=control:trackID=1

与其他答案类似,如果您实际上不需要不同的流名称或不同的sprop-parameter-sets,则应该能够在中途使用您的第一个SDP和切换格式。我不知道H.264或您的特定解码器的实际有效载荷是否足以确保它在您的应用程序中有效但在视频会议应用程序中非常常见,允许在分辨率之间动态切换而不需要发出变化或需要单独的动态有效载荷类型。

虽然您可以连接另一个答案中提到的两个SDP文档,但我认为在这种情况下它不会有所帮助。 H.264解码器只能在我认为的时候使用单个sprop-parameter-sets参数。由于两个SDP将具有相同的有效载荷类型,源端口等,因此接收器将不知道何时使用哪个sprop-parameter-sets参数。更新:注意一些实现在带内而不是从SDP(或者最初只是从SDP)获得它们的sprops。如果这适用于您的环境,则可以在带内更新SDP sprop-parameter-sets

参考文献:

  1. 用于H.264视频的RFC 3984 RTP有效载荷格式
  2. 新建议的H.264 RTP有效载荷格式RFC 6184
  3. RFC 4566 SDP:会话描述协议
  4. [抱歉没有给出完整的引用 - 随意纠正]

其他提示

我已经浏览了RFC( RFC2327 - SDP:会话描述协议 )看来你可以连接两个SDP文件。该文件明确说明:

  

当SAP传送SDP时,每个数据包只允许一个会话描述。当通过其他方式传达SDP时,许多SDP会话描述可以连接在一起(“v =”行表示会话描述的开始终止先前的描述)

我认为这取决于你的解码器。如果它支持流内的参数更改,那么如果您可以告诉编码器在更改分辨率时放置相应的标题,您的解码器应该自动切换。

你的问题到底是什么? 它是:如何在不停止/重新启动流的情况下更改分辨率?

我认为你不能事先告诉解码器,这里有你可以看到的一些sdp魔法的潜在解决方案。您的解码器能够理解H264参数更改,然后您就可以了,或者您必须停止重启整个事件,然后动态sdp就足够了。

我知道,例如,VLC能够检测MP4编码变化(例如从可变比特率转换为恒定比特率),但如果更改分辨率将会崩溃 您可以使用sdp做的唯一事情是组合不同的媒体描述,例如使用不同的动态有效负载类型和不同的control-id属性。

您可以执行动态有效内容更改或流内参数集更改,也可以执行SIP re-INVITE。

有效负载变化有一个问题,如果您不控制编码器和解码器,您需要确保另一端接受两个有效负载,并且他们将正确切换有效负载(并且足够快 - 对您没有要求)这一点)。

如果参数设置数据包丢失,

流内更改会出现问题。您可以使用一组不同的参数集(更改时从参数集1切换到2)以避免误解码 - 如果集合丢失,您应该只获得冻结或空白图片。我建议几次转发它们(不要太快连续)。

SIP re-INVITE是带外和握手,因此是安全的,但会增加任何开关的延迟,并且可能会因接收器而出现故障,并且可能被拒绝。

(注意:我是RFC 3984bis的作者,RFC 3984的更新)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top