首先我要试着解释一下我想要做什么:
我有一台IP摄像机,它有一个循环缓冲区,我想从中读取数据。相机和我的应用程序之间的通信通过RTSP进行,这意味着我有一个到相机的TCP连接。 相机本身能够通过RTP传输数据。
现在重要的是,当相机开始流式传输时,我的应用程序应不读回数据。网络中有某种被动数据记录器负责记录数据。
问题是,只要相机正在流式传输,我的应用程序中的套接字需要打开,否则相机将停止流式传输。
所以,让我们看看到目前为止:
我打开一个套接字,它连接到摄像头,然后发送所需的RTSP命令OPTIONS
,DESCRIBE
,SETUP
,然后PLAY
。在此之后我的插座保持打开状态,摄像机就会流动。
现在出现了困难的部分:
正如我已经说过的,我无法解析所有UDP数据。但是,如何确定流何时结束?在wireshark上,我看到当流完成时,我收到一条RTCP
消息,上面写着Sender Report Goodbye
。
这就是我要关闭套接字的地方,但是如何在不解析任何UDP数据的情况下确定摄像头已完成?
答案 0 :(得分:2)
为什么不想解析RTCP数据包:这不是很困难。
TCP连接关闭后,相机停止流式传输是没有意义的。根据RTSP RFC:
没有RTSP连接的概念;相反,服务器维护 由标识符标记的会话。 RTSP会话绝不是束缚 到TCP连接等传输级连接。期间 RTSP会话,RTSP客户端可以打开和关闭许多可靠的 传输到服务器的连接以发出RTSP请求。 或者,它可以使用诸如的无连接传输协议 UDP。
除非我的解释不正确,否则套接字的关闭不应影响媒体流。您应该让制造商遵守RTSP规范。
仅供参考,通常建议如果没有发生任何活动,RTSP服务器会超时TCP连接。 AFAIR默认为60秒。您可以通过定期发送GET_PARAMETER请求来保持连接处于活动状态。
作为一种解决方法,由于您正在使用RTSP,因此您知道RTP和RTCP连接的传入端口号。如果您不想解析RTCP以查找BYE消息,您可以简单地丢弃所有传入的RTP和RTCP数据包,然后一旦在RTP端口上没有收到数据包x秒,关闭与服务器的连接。
答案 1 :(得分:1)
好的,可以确定Stream的结束。
Stream启动后有两条通信线路。
有RTP
Stream,其中包含所有原始数据。除此之外,还有一些RTCP
数据,可用于控制流。
重要的是,数据是在不同的端口上发送的。这些端口在RTSP SETUP
请求中定义。现在,当摄像机正在流式传输时,RTP
上传入的数据可以按预期被忽略,而您可以打开一个套接字来监听RTCP
端口。在流完成之前,您会得到一些Sender Reports
(最后Sender Report Goodbye
)。如果您阅读此消息,您知道可以关闭,因为流已完成。
注意:在某些设备上,您可能需要发送一些Receiver Reports
作为Sender Reports
的答案,否则流可能会停止,因为设备认为客户端已超时。
答案 2 :(得分:0)
由于您必须处于通过RTP
/ UDP
发送的数据之上,以便有效地检测广播结束,我只能考虑实施完整的RTSP客户端(使用RTP部分)并重新启动 - 将RTP发送到感兴趣的地址。否则只有RTSP控制连接而没有看到实际的RTP数据,你不可能查询或以其他方式获得RTP数据传输的状态,无论它是否仍处于活动状态,或是否已到达终点。
答案 3 :(得分:0)
正如Toby所说,RtcpGoodbye数据包通常表明Rtp会话结束了。
如果您需要一个库来解析数据包,请查看http://net7mma.codeplex.com/
它有一个RtspClient和RtspServer实现,并且可以与VLC一起使用,因此您可以使用Wireshark查看当连接到带有VLC的RtspServer时,它如何告诉客户端节目已经结束或者只是中断。
如果您还需要其他信息,请告诉我们!