不幸的是,我仍然坚持使用 RTP / RTCP 通信的一点实现来正确访问我的 IP 摄像机。
我想做什么
相机有一个我想读取的内部缓冲区。所以我通过 RTSP 与相机通信并告诉它流式传输数据。当相机穿过整个缓冲区时,流式传输将停止。
到目前为止我有什么
一个 TCP 连接,它通过 RTSP 为
DESCRIBE
//请求 ( RTSP ) 进行通信以启动流SETUP
。PLAY
当相机传输其数据时,此连接必须保持打开状态。我接收通过 RTP(基于 UDP)发送的数据的端口 - 处理这不是我关心的问题,我什至完全无法访问它,我只是为了完整起见而提及它。
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,你不应该告诉你的孩子这样编程。
现在我的问题发生了一点变化:这个黑客可以吗?它似乎有效,但我仍然有点担心我的相机会使用那些虚拟数据并更改配置,因为它会在其中插入一些奇怪的东西?