gpt4 book ai didi

c++ - 检查 RTSP Stream 是否结束

转载 作者:行者123 更新时间:2023-11-30 03:03:32 25 4
gpt4 key购买 nike

首先我要解释一下我到底想做什么:

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

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

问题是,只要摄像头在流式传输,我的应用程序中的 Socket 就需要打开,否则摄像头将停止流式传输。

让我们看看到目前为止我有什么:

我打开一个连接到相机的套接字,然后发送所需的 RTSP 命令 OPTIONSDESCRIBESETUP 然后是 播放。在此之后,我的套接字保持打开状态并且相机流。

困难的部分来了:

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

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

最佳答案

为什么不想解析RTCP数据包:这不是很困难。

一旦 TCP 连接关闭,相机停止流式传输是没有意义的。根据 RTSP RFC:

There is no notion of an RTSP connection; instead, a server maintains a session labeled by an identifier. An RTSP session is in no way tied to a transport-level connection such as a TCP connection. During an RTSP session, an RTSP client may open and close many reliable transport connections to the server to issue RTSP requests. Alternatively, it may use a connectionless transport protocol such as UDP.

除非我的解释不正确,否则套接字的关闭应该不会影响媒体流。您应该让制造商符合 RTSP 规范。

仅供引用,如果没有事件发生,通常建议 RTSP 服务器使 TCP 连接超时。 AFAIR 默认值为 60 秒。您可以通过定期发送 GET_PARAMETER 请求来保持连接。

作为解决方法,由于您正在执行 RTSP,因此您知道 RTP 和 RTCP 连接的传入端口号。如果您不想解析 RTCP 以查找 BYE 消息,您可以简单地丢弃所有传入的 RTP 和 RTCP 数据包,然后一旦在 RTP 端口上 x 秒没有收到任何数据包,关闭与服务器的连接。

关于c++ - 检查 RTSP Stream 是否结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9292034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com