检查RTSP Stream是否已完成

时间:2012-02-15 10:56:32

标签: c++ sockets stream udp rtsp

首先我要试着解释一下我想要做什么:

我有一台IP摄像机,它有一个循环缓冲区,我想从中读取数据。相机和我的应用程序之间的通信通过RTSP进行,这意味着我有一个到相机的TCP连接。 相机本身能够通过RTP传输数据。

现在重要的是,当相机开始流式传输时,我的应用程序应读回数据。网络中有某种被动数据记录器负责记录数据。

问题是,只要相机正在流式传输,我的应用程序中的套接字需要打开,否则相机将停止流式传输。

所以,让我们看看到目前为止:

我打开一个套接字,它连接到摄像头,然后发送所需的RTSP命令OPTIONSDESCRIBESETUP,然后PLAY。在此之后我的插座保持打开状态,摄像机就会流动。

现在出现了困难的部分:

正如我已经说过的,我无法解析所有UDP数据。但是,如何确定流何时结束?在wireshark上,我看到当流完成时,我收到一条RTCP消息,上面写着Sender Report Goodbye

这就是我要关闭套接字的地方,但是如何在不解析任何UDP数据的情况下确定摄像头已完成?

4 个答案:

答案 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时,它如何告诉客户端节目已经结束或者只是中断。

如果您还需要其他信息,请告诉我们!