使用 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 中 - 错误响应中使用了内容长度。修复后问题解决。
我有一个来自 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 中 - 错误响应中使用了内容长度。修复后问题解决。