11

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

640x480.sdp:

v=0
o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
s=视频流640x480
t=0 0
c=IN IP4 192.168.0.2
m=视频 8000/2 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 打包模式=0;配置文件级别 ID = 4D4033;sprop 参数集=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
a=控制:trackID=1

960x480.sdp:

v=0
o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
s=视频流960x480
t=0 0
c=IN IP4 192.168.0.2
m=视频 8000/2 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 打包模式=0;配置文件级别 ID = 4D4033;sprop 参数集=J01AM5WwPA9sBAIA,KO4G8gA=
a=控制:trackID=1

如何将这些单独的文件组合成一个 SDP 文件?

4

4 回答 4

9

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

    v=0
    o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
    s=视频流640x480
    t=0 0
    c=IN IP4 192.168.0.2
    m=视频 8000/2 RTP/AVP 96 97
    a=rtpmap:96 H264/90000
    a=fmtp:96 打包模式=0;配置文件级别 ID = 4D4033;sprop 参数集=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
    a=rtpmap: 97 H264/90000
    a=fmtp: 97打包模式=0;配置文件级别 ID = 4D4033;sprop 参数集=J01AM5WwPA9sBAIA,KO4G8gA=
    a=控制: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:会话描述协议

[抱歉没有给出完整的引用-请随时纠正]

于 2008-10-23T21:12:12.027 回答
2

我已经查看了 RFC ( RFC2327 - SDP: Session Description Protocol ),看来您可以连接两个 SDP 文档。该文件明确指出:

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

于 2008-10-05T10:58:48.543 回答
0

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

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

我不认为您可以提前告诉解码器,这是您将通过一些 sdp 魔术看到的潜在分辨率。要么你的解码器能够理解H264参数变化,然后你就没事了,要么你必须停止重新启动整个事情,然后动态sdp就足够了。

我知道,例如,VLC 能够检测 MP4 编码的变化(例如从可变比特率移动到恒定比特率),但是如果你改变分辨率就会崩溃你唯一能用 sdp 做的就是结合不同的媒体描述,例如具有不同的动态有效负载类型和不同的 control-id 属性。

于 2008-10-06T09:10:02.227 回答
0

您可以进行动态有效负载更改或流内参数集更改,或 SIP re-INVITE。

有效负载更改有一个问题,如果您不控制编码器和解码器,您需要确保另一端接受两个有效负载,并且它们会正确切换有效负载(并且对您来说足够快 - 对此没有要求)。

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

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

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

于 2009-11-05T17:56:13.583 回答