【问题标题】:Wrapping an existing RTP stream with RTSP使用 RTSP 包装现有 RTP 流
【发布时间】:2015-03-07 15:57:39
【问题描述】:

我有一个来自 ffmpeg 的 RTP 多播流,它要求用户使用外部 SDP 文件,因为这有时会成为我正在考虑使用 RTSP 包装流的问题。

我有一个应用程序已经对 RTP 流进行了一些管理,因此在其中包含 RTSP 包装器也会很有用,尽管我不希望包装器在传递 SDP 信息之外做任何事情。现在我会说我正确地传递了 SDP 信息(否则它会卡在那个请求中),但是我没有收到任何 PLAY 命令,播放器在 SETUP 请求后卡住了,所以我想我的回复是错误的,但是在为 Transport 标头测试了许多不同的值之后,我无法得到任何超出这一点的东西。

这是 SDP:

v=0 o=- 0 0 IN IP4 127.0.0.1 s=No Name c=IN IP4 236.0.0.1 t=0 0 a=tool:libavformat 56.7.102 m=video 2000 RTP/AVP 96 b=AS:500 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1

这是来自 VLC 的示例 SETUP 请求:

SETUP rtsp://127.0.0.1:34343/live.sdp/ RTSP/1.0 CSeq: 4 User-Agent: LibVLC/2.1.5 (LIVE555 Streaming Media v2014.05.27) Transport: RTP/AVP;multicast;client_port=2000-2001

我尝试过的众多回复之一:

RTSP/1.0 200 OK CSeq: 4 Transport: RTP/AVP;multicast;client_port=2000-2001;source=236.0.0.1;port=2000-2001 Session: 0456804596

我试过用destination代替source,用server_port代替port,虽然RTP多播端口是2000,但我看到流媒体也在使用其他端口,比如57927和57928,所以我试过了等等。

【问题讨论】:

    标签: c# .net ffmpeg rtsp rtp


    【解决方案1】:

    只是我的两分钱,但从逻辑的角度来看,用于多播 RTSP 流的PLAY 命令没有任何意义,因为客户端一旦加入组就会获得媒体。多播流本身没有状态。

    此时多播 RTP 流是否处于活动状态?也许 VLC 在SETUP 响应之后实际上加入了该组,但没有数据传输给它?您也可以使用 VLC 错误日志来查看发生了什么。

    编辑

    这是一个示例 RTSP 会话,其中 VLC 和 IP 摄像机之间的多播流:

    DESCRIBE rtsp://192.168.3.142/stream/profile1=m RTSP/1.0
    CSeq: 5
    User-Agent: LibVLC/2.0.1 (LIVE555 Streaming Media v2011.12.23)
    Accept: application/sdp
    
    RTSP/1.0 200 OK
    CSeq: 5
    Connection: Keep-alive
    Date: Sat, 10 Jan 2015 16:54:28 GMT
    Content-Type: application/sdp
    Content-Length: 352
    
    v=0
    o=- 0 0 IN IP4 192.168.3.142
    s=rtsp://192.168.3.142/stream/profile1
    t=0 0
    a=control:*
    m=video 2014 RTP/AVP 99
    a=rtpmap:99 H264/90000
    a=fmtp:99 sprop-parameter-sets=Z0LgKdoB4Aiflm4CAgwE,aM48gA==;packetization-mode=1;profile-level-id=42e029
    a=control:rtsp://192.168.3.142/stream/profile1/AVCESEnc
    a=framerate:30.0
    c=IN IP4 239.100.10.10/1
    
    SETUP rtsp://192.168.3.142/stream/profile1/AVCESEnc RTSP/1.0
    CSeq: 6
    User-Agent: LibVLC/2.0.1 (LIVE555 Streaming Media v2011.12.23)
    Transport: RTP/AVP;multicast;client_port=2014-2015
    
    RTSP/1.0 200 OK
    CSeq: 6
    Connection: Keep-alive
    Date: Sat, 10 Jan 2015 16:54:28 GMT
    Session: 241934337;timeout=60
    Transport: RTP/AVP;multicast;destination=239.100.10.10;port=2014-2015;ttl=1
    
    PLAY rtsp://192.168.3.142/stream/profile1=m RTSP/1.0
    CSeq: 7
    User-Agent: LibVLC/2.0.1 (LIVE555 Streaming Media v2011.12.23)
    Session: 241934337
    Range: npt=0.000-
    
    RTSP/1.0 200 OK
    CSeq: 7
    Connection: Keep-alive
    Date: Sat, 10 Jan 2015 16:54:28 GMT
    Session: 241934337
    RTP-Info: url=rtsp://192.168.3.142/stream/profile1/AVCESEnc;seq=14604;rtptime=3766807430
    
    GET_PARAMETER rtsp://192.168.3.142/stream/profile1=m RTSP/1.0
    CSeq: 8
    User-Agent: LibVLC/2.0.1 (LIVE555 Streaming Media v2011.12.23)
    Session: 241934337
    
    RTSP/1.0 200 OK
    CSeq: 8
    Connection: Keep-alive
    Date: Sat, 10 Jan 2015 16:54:29 GMT
    Session: 241934337
    
    TEARDOWN rtsp://192.168.3.142/stream/profile1=m RTSP/1.0
    CSeq: 9
    User-Agent: LibVLC/2.0.1 (LIVE555 Streaming Media v2011.12.23)
    Session: 241934337
    
    RTSP/1.0 200 OK
    CSeq: 9
    Connection: Close
    Date: Sat, 10 Jan 2015 16:54:31 GMT
    Session: 241934337
    

    编辑 2

    从 cmets 中可以看出,Neverbirth 指出问题不在SETUP 命令中,而是在DESCRIBE 命令的 HTTP 标头中 - 响应中使用了错误的内容长度。修复后问题就解决了。

    【讨论】:

    • 是的,RTP 流此时处于活动状态。不发送 PLAY 命令是有意义的,但根据 RTSP 规范,应该发送 PLAY 命令。此外,VLC 日志并没有被证明太有用......除非在日志窗口之外还有另一个日志。
    • @Neverbirth 为了提供更多帮助,我尝试使用 VLC 对抗具有多播功能的 IP 摄像机,看看会发生什么。 VLC 确实发送了播放命令,所以我试图看看SETUP 响应可能有什么问题。相机将传输描述为Transport: RTP/AVP;multicast;destination=239.100.10.10;port=2014-2015;ttl=1。查看 RFC 并没有说明 destinationttl 应该是强制性的,但所有示例仍然使用它们。我想说尝试添加destinationttl,我认为您不需要将源设置为多播IP,因为流实际上来自您的IP。
    • 正如我在原帖中所说,我已经尝试过了,但会再次以防万一。你是怎么看到命令的? Wireshark,一些代理还是通过一些 VLC 日志?你能以 bin 格式发布完整的 SETUP 回复吗?也许我错过了一些标题......
    • @Neverbirth 是的,对不起,我错过了。我使用 Wireshark 捕获了流量,如果有帮助,我可以将整个 RTSP 会话放在这里。
    • 获得完整的会话不会有什么坏处。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2012-11-08
    • 2010-12-16
    • 1970-01-01
    相关资源
    最近更新 更多