【发布时间】:2012-02-15 10:56:32
【问题描述】:
首先我要解释一下我到底想做什么:
我有一个 IP 摄像机,它有一个循环缓冲区,我想从中读取数据。相机和我的应用程序之间的通信是通过 RTSP 进行的,这意味着我有一个到相机的 TCP 连接。 相机本身能够通过 RTP 传输数据。
现在重要的是,当相机开始流式传输内容时,我的应用程序应该不读回数据。网络中有某种被动数据记录器,负责记录数据。
问题是,只要摄像头在流式传输,我的应用程序中的 Socket 就需要打开,否则摄像头将停止流式传输。
那么让我们看看我目前有什么:
我打开一个套接字,它连接到摄像头,然后发送所需的 RTSP 命令OPTIONS、DESCRIBE、SETUP,然后是PLAY。在此之后,我的套接字保持打开状态并且相机流式传输。
现在困难的部分来了:
正如我已经说过的,我无法解析所有的 UDP 数据。但是我怎样才能确定流何时结束?在wireshark 上,我看到当流结束时,我收到一条RTCP 消息,上面写着Sender Report Goodbye。
这是我想要关闭套接字的地方,但我如何确定相机已经完成而不解析任何 UDP 数据?
【问题讨论】:
-
AFAIK RTP 是基于 UDP 的,而事件是在 TCP 的 RTCP 上发送的。所以你必须阅读 TCP 连接...
-
是的,但是 RTCP 没有给我任何关于流状态的信息。所以我从 TCP 连接获得的任何信息都无法告诉我流是否完成:/
-
"在 wireshark 上,我看到当流结束时,我收到一条 RTCP 消息,上面写着 Sender Report Goodbye"
-
哦,对不起,我对所有缩写感到困惑 - 是的,RTCP 发送 Goodbyer 信号但是 RTCP 不是基于 TCP,而是基于 UDP。所以这条消息可能会在我不知情的情况下丢失。
标签: c++ sockets stream udp rtsp