使用 RTSP 包装现有的 RTP 流

Wrapping an existing RTP stream with RTSP

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

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

这是 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

我试过使用目标而不是源,server_port而不是端口,另外,虽然 RTP 多播端口是 2000,但我看到流式传输也使用其他端口,如 57927 和 57928,所以我也尝试了那些,等等

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

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

编辑

这是一个 RTSP session 示例,在 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

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