不幸的是,我仍然停留在RTP/RTCP通信的一些实现上,无法正确访问我的IP摄像机。
我要怎么做
相机有一个我要读取的内部缓冲区。因此,我通过RTSP与摄像机通信,并告诉它传输数据。当摄像机经过整个缓冲区时,流媒体将停止。
到目前为止我有什么
DESCRIBE
/SETUP
/PLAY
请求(RTSP)通信以启动流。相机在传输数据时,此连接必须保持打开状态。 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/