2012-02-23 82 views
7

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

什么做我想做的事

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

什么我至今

  1. 它通过RTSP通信的DESCRIBE/SETUP/PLAY请求(RTSP),以获得该流的TCP连接开始。此连接必须保持打开,而摄像机将其数据流。

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

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

到底哪里出问题了

它正在为小缓冲区大小2MB一样4MB或。我收到一些来源说明,然后收到Goodbye。但在我的特殊测试案例中,我想使用16MB(这还不到相机能够达到的一半)。 我收到发件人报告,但在某些时候(总是在8MB +/- 300KB左右),摄像机停止发送。

值得注意的是,我可以通过VLC访问缓冲区,而且没有问题。我甚至看了这几乎是完全一样的我的应用程序通信(RTSP和RTCP)......有一两件事失踪,我要去下面提及:

可能原因

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

可能性:缺乏接收器的报告

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

解决方案?

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

  • 如果它与缺乏Receiver Reports没有关系,我只是不需要它们,那么相机停止流式传输的原因是什么?有什么建议么?

编辑:

好吧,我好不容易才创建某种虚拟Receiver Report的,它似乎工作(我只可以接收12MB然后我得到了想要再见)

我只是填充一个28Byte缓冲器和刚才在所述报头字段的某些值,这意味着:

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) 

缓冲器的其余部分我刚充满了零。是的,我知道这只是一个黑客,你不应该告诉你的孩子这样编程。

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

+0

您是否考虑过使用现有的RTP库来处理此问题? – nos 2012-02-23 18:29:49

+0

@nos当然这将是一个替代方案,但我实际上是想避免使用任何库,因为我只是想让流保持活跃状态​​ - 甚至不需要解析RTCP中的任何内容(期望它是再见当然的消息)。其次整个应用程序需要完全异步,所以我想自己管理所有套接字等。 Afaik大多数库将控制自己的插座和连接。但是,如果我真的需要正确填充Receiver报告(使用一些“复杂”数据),我可能真的考虑使用lib – Toby 2012-02-23 23:40:35

+0

您是否在应用程序运行时完成了Wireshark数据包捕获?这会告诉你到底是什么或不在你的数据。 – 2012-03-08 16:16:35

回答

1

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

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

+0

我实际上想要省掉我拥有的任何资源(嵌入式设备),所以我想避免读取所有这些数据。这是没有必要的,因为我不需要它(RTCP除外)。所以我真的更喜欢用一些虚拟值来做。 – Toby 2012-03-21 13:14:30

+0

虽然您可能不需要它,但服务器可以调整/扼制数据以防止泛滥网络和数据包丢失。 – Deanna 2015-03-17 18:12:15

1

接收器报告(RR)可被某些摄像头用作“保持活动”消息。如果GET_PARAMETER被相机接受,您可以尝试每分钟发送一次相机GET_PARAMETER作为保存活动消息。了解它对DESCRIBE的回应。

某些IP摄像机无法正确解析RR。实际上,我试图阻止我在客户端使用的live555库发送RR消息,因为某些型号的三星相机会断开连接(根据他们的技术支持)。