RTCP/RTP通信问题

Tob*_*oby 9 c++ udp rtp rtsp rtcp

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

我想做什么

相机有一个我想读的内部缓冲区.因此,我通过RTSP与相机通信,并告诉它流式传输数据.当摄像机通过整个缓冲区时,流媒体将停止.

到目前为止我有什么

  1. 通过RTSP与DESCRIBE/ SETUP/ PLAYRequest(RTSP)通信以启动流的TCP连接.当Camera传输数据时,此连接必须保持打开状态.

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

  3. 接收RTCP Sender Reports/的UDP套接字Source Descriptions.这很重要,因为我不知道流何时停止(如第2点所述,我不能只看流停止时).在这个Socket我读到RTCP Sender Report Goodbye到来,这意味着流式传输已经完成.然后我可以关闭TCP Socket(来自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,我只是不需要它们,那么相机停止流动的原因是什么呢?有什么建议?

编辑:

好吧,我只是设法制作某种Dummy Receiver 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 )
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*Ben 1

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

如果您需要将其转发到另一个应用程序或库的另一个端口,您只需这样做即可。