不幸的是,我仍然坚持使用RTP/RTCP通信的一些实现来正确访问我的IP摄像机。RTCP/RTP通信问题
什么做我想做的事
相机有哪些我想读的内部缓冲区。所以我通过RTSP与相机进行通信,并告诉它传输数据。当相机经过整个缓冲区时,流式传输将停止。
什么我至今
它通过RTSP通信的
DESCRIBE
/SETUP
/PLAY
请求(RTSP),以获得该流的TCP连接开始。此连接必须保持打开,而摄像机将其数据流。我接收通过RTP发送的数据的一个端口(基于UDP) - 处理这个并不是我的担心,我甚至完全无法访问它,我只是为了完整性而提及它。
接收RTCP的UDP套接字
Sender Reports
/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
)。那么是否会在特定的时间内(或在发送特定数量的字节后)至少有一个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)
缓冲器的其余部分我刚充满了零。是的,我知道这只是一个黑客,你不应该告诉你的孩子这样编程。
现在我的问题发生了一些变化:这个黑客可以吗?它似乎工作,但我仍然有点担心我的相机会使用这些虚拟数据并更改配置,导致它插入一些奇怪的东西呢?
您是否考虑过使用现有的RTP库来处理此问题? – nos 2012-02-23 18:29:49
@nos当然这将是一个替代方案,但我实际上是想避免使用任何库,因为我只是想让流保持活跃状态 - 甚至不需要解析RTCP中的任何内容(期望它是再见当然的消息)。其次整个应用程序需要完全异步,所以我想自己管理所有套接字等。 Afaik大多数库将控制自己的插座和连接。但是,如果我真的需要正确填充Receiver报告(使用一些“复杂”数据),我可能真的考虑使用lib – Toby 2012-02-23 23:40:35
您是否在应用程序运行时完成了Wireshark数据包捕获?这会告诉你到底是什么或不在你的数据。 – 2012-03-08 16:16:35