【问题标题】:Check if RTSP Stream has finished检查 RTSP 流是否已完成
【发布时间】:2012-02-15 10:56:32
【问题描述】:

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

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

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

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

那么让我们看看我目前有什么:

我打开一个套接字,它连接到摄像头,然后发送所需的 RTSP 命令OPTIONSDESCRIBESETUP,然后是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


【解决方案1】:

你为什么不想解析 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 秒内没有收到数据包后,关闭与服务器的连接。

【讨论】:

  • 他希望在服务器和外部软件项之间保持RTP/UDP 通信。他只会处理RTSP。如果他能够发送一个RTSP命令查询广播的状态,那将满足需求,但我认为除非RTSP服务器对此有自定义扩展,否则这是不可能的。
  • 嗯,你明白了,但你引用的部分 -> 它不是说明了 RTSP 连接和另一个 TCP 连接之间的关系吗?我拥有的是一个 RTSP 连接来控制 RTP 广播(其中 RTP 属于 UDP )。现在,当我的 TCP ( RTSP ) 套接字关闭时,我确实确保相机停止 RTP 流。目前我这样做是这样的:我读回循环 RTCP 消息(会话描述),直到我收到“Sender Report Goodbye” - 如果出现这种情况,我知道我可以关闭我的 TCP 套接字。如果在给定的超时时间内没有报告出现,我也会关闭它..
  • @Toby AFAIU RTSP 连接是 TCP 连接。对我来说,这意味着如果 RTSP 连接因会话标识符用于维护状态而关闭,则服务器不应停止流式传输。您的解决方案听起来是最好的选择,很高兴您来对了。
  • @Ralf 你说得对,即使 RTSP 连接中的 Socket 关闭,相机实际上也应该继续流式传输。但是由于相机上的实现似乎不这么认为^^我需要用这个来安排我的应用程序!好吧,但我想(正如你所说)我现在这样做的方式还可以!应该够了!感谢您的帮助!
【解决方案2】:

好的,可以确定 Stream 的结束。

Stream 启动后有两条通信线路。 RTP Stream 包含所有原始数据。除此之外还有一些RTCP数据,可以用来控制流。

重要的是,数据在不同的端口上发送。这些端口在RTSP SETUP 请求中定义。现在,当相机正在流式传输时,RTP 上传入的数据可以按预期忽略,而您可以打开一个套接字来侦听RTCP 端口。在那里你会得到一些 Sender Reports 直到流完成(最后一个 Sender Report Goodbye )。如果您阅读此消息,您知道您可以关闭,因为流已结束。

注意:在某些设备上,您可能需要发送一些Receiver Reports 作为对Sender Reports 的答复,否则流可能会停止,因为设备认为客户端超时。

【讨论】:

    【解决方案3】:

    由于您必须掌握通过RTP/UDP 发送的数据才能有效检测广播结束,所以我只能考虑实现完整的 RTSP 客户端(带有 RTP 部分)并将 RTP 重新发送到感兴趣的地址。否则只有 RTSP 控制连接而没有看到实际的 RTP 数据,您不太可能查询或以其他方式获取 RTP 数据传输的状态,无论它仍然处于活动状态还是已到达终点。

    【讨论】:

      【解决方案4】:

      正如 Toby 所说,RtcpGoodbye 数据包通常表明 Rtp 会话结束。

      如果您需要一个库来解析数据包,请查看http://net7mma.codeplex.com/

      它具有 RtspClient 和 RtspServer 实现并与 VLC 一起使用,因此您可以使用 Wireshark 查看它如何告诉客户节目结束或在使用 VLC 连接到 RtspServer 时中断代码。

      如果您还需要什么,请告诉我!

      【讨论】:

        猜你喜欢
        • 2014-07-22
        • 1970-01-01
        • 2021-01-12
        • 2011-10-18
        • 2017-11-13
        • 2014-09-11
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多