不幸的是,我仍然停留在RTP/RTCP通信的一些实现上,无法正确访问我的IP摄像机。

我要怎么做

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

到目前为止我有什么

  • 一个TCP连接,该TCP连接通过RTSP为DESCRIBE/SETUP/PLAY请求(RTSP)通信以启动流。相机在传输数据时,此连接必须保持打开状态。
  • 我接收通过RTP(基于UDP)发送的数据的端口-处理此无关我的事,我什至绝对无法访问它,出于完整性的考虑,我只想提及它。
  • 一个UDP套接字,它接收RTCP Sender Reports/Source Descriptions。这很重要,因为我不知道流何时停止(如第2点所述,我不能只看流何时停止)。在此Socket上,我读取直到RTCP Sender Report Goodbye出现,这意味着流已完成。然后我可以关闭TCP套接字(从RTSP
    沟通)。

  • 出了什么问题

    它适用于较小的缓冲区大小,例如2MB或4MB。我收到一些源代码说明,然后是Goodbye。但是在我的特定测试用例中,我想使用16MB(仍不到相机功能的一半)。
    我收到了发件人报告,但是在某些时候(总是在8MB +/- 300KB左右),相机只是停止发送。

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

    可能的原因

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

    可能性:缺少收件人报告

    通过VLC进行流式传输时,我注意到从VLC发送到摄像机的RTCP Receiver Reports有一些(类似于Sender Reports的循环)。那么,这可能是camer在特定时间内(或在发送一定数量的字节之后)期望至少一个Receiver Report吗?
    目前,我无法想到任何其他原因。

    解决方案?
  • 如果我们假设摄像机因为没有Receiver Reports而停止流传输,我想知道是否有一种方法可以实现它们而不携带太多信息。我已经读过RFC 3550的一些内容,并且我猜想这些Report消息背后仍然有很多逻辑。现在我实际上不需要了,所以我也不想在这里实现完整的RTCP协议(protocol)。发送一些Receiver Report虚拟帧是否足以使相机保持流式传输?如果是这样,它们看起来如何?
  • 如果这与缺少Receiver Reports无关,而我只是不需要它们,那么相机停止流播的原因可能是什么?有什么建议么?

  • 编辑:

    好的,我刚刚设法创建了一种虚拟的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 )
    

    缓冲区的其余部分我只填充了零。是的,我知道这只是黑客,您不应该告诉您的 child 像这样编程。

    现在我的问题有了一点改变:这种破解方法可以吗?它似乎可以正常工作,但是我还是有点担心我的相机会使用这些伪数据并更改配置,因为它会干扰其中的一些奇怪的东西吗?

    最佳答案

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

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

    关于c++ - RTCP/RTP通讯问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9417687/

    10-12 22:09