9

不幸的是,我仍然坚持使用 RTP / RTCP 通信的一点实现来正确访问我的 IP 摄像机。

我想做什么

相机有一个我想读取的内部缓冲区。所以我通过 RTSP 与相机通信并告诉它流式传输数据。当相机穿过整个缓冲区时,流式传输将停止。

到目前为止我有什么

  1. 一个 TCP 连接,它通过 RTSP 为DESCRIBE//请求 ( RTSP ) 进行通信以启动流SETUPPLAY当相机传输其数据时,此连接必须保持打开状态。

  2. 我接收通过 RTP(基于 UDP)发送的数据的端口 - 处理这不是我关心的问题,我什至完全无法访问它,我只是为了完整起见而提及它。

  3. Sender Reports接收 RTCP /的 UDP 套接字Source Descriptions。这很重要,因为我不知道流何时停止(如第 2 点所述,我不能只看流何时停止)。在这个 Socket 上,我一直读到 RTCPSender Report Goodbye到来,这意味着流式传输已经完成。然后我可以关闭 TCP 套接字(来自 RTSP 通信)。

出了什么问题

它适用于像 2MB 或 4MB 这样的小缓冲区。我收到一些源描述,然后是Goodbye. 但在我的特定测试案例中,我想使用 16MB(这仍然不到相机容量的一半)。我收到了发件人报告,但在某些时候(总是在 8MB +/-300KB 左右)相机会停止发送。

值得注意的是,我可以毫无问题地通过 VLC 访问缓冲区。我什至查看了与我的应用程序中几乎完全相同的通信( RTSP 和 RTCP )......缺少的一件事我将在下面提到:

可能的原因

这是我需要你建议的部分。

可能性:缺乏接收方报告

当通过 VLC 进行流式传输时,我注意到有一些 RTCP Receiver Reports从 VLC 发送到相机(像循环一样Sender Reports)。那么,camere 是否期望在Receiver Report特定时间(或发送特定数量的字节后)至少有一个?目前我想不出任何其他原因。

解决方案?

  • 如果我们假设相机停止流式传输是因为没有,Receiver Reports我想知道是否有一种方法可以在不携带太多信息的情况下实现它们。我已经阅读了一些RFC 3550并且我猜这些报告消息背后仍然存在一堆逻辑。现在我实际上不需要,所以我也不想在这里实现一个完整的 RTCP 协议。发送一些虚拟帧是否足以Receiver Report让相机继续流式传输?如果是这样,它们看起来如何?

  • 如果它与缺少无关Receiver Reports并且我只是不需要它们,那么相机停止流式传输的原因可能是什么?有什么建议么?

编辑:

好的,我只是设法创建了某种 DummyReceiver Report并且它似乎可以工作(我只能收到 12MB 然后我得到了想要的再见)

我刚刚填充了一个 28Byte 的缓冲区,并在 Header 字段中使用了一些值,这意味着:

buffer[0] = 0x80;   // Version 2 , Padding = false, Reception Count = 0
buffer[1] = 0xC9;   // Packet Type 201 Receiver Report
buffer[2] = 0x00;   // Higher byte for total length
buffer[3] = 0x06;   // Lower byte for total length ( in 32 Bit words -> 28 Byte )

我刚刚用零填充缓冲区的其余部分。是的,我知道这只是一个 hack,你不应该告诉你的孩子这样编程。

现在我的问题发生了一点变化:这个黑客可以吗?它似乎有效,但我仍然有点担心我的相机会使用那些虚拟数据并更改配置,因为它会在其中插入一些奇怪的东西?

4

2 回答 2

1

Receiver report (RR) can be used by some cameras as "keep alive" message. You can try instead to send to you camera GET_PARAMETER every minute as keep alive message, if GET_PARAMETER is accepted by the camera. See what it tells you in response to DESCRIBE.

Some IP cameras can't parse RR properly. I'm actually trying to prevent the live555 library that I use in my client from sending RR messages because some models of Samsung cameras drop connection (according to their tech support).

于 2012-07-27T19:12:01.113 回答
1

您应该自己从流中读取数据。这样你就可以给出真实的接收者报告而不是虚拟的报告。

如果您需要将其转发到另一个端口以用于另一个应用程序或库,您可以简单地执行此操作。

于 2012-03-21T12:50:47.503 回答