我遇到了必须将多个客户端连接到 RTSP 视频流的问题,而不会使原始流摄像机的带宽过载。基本上,我想要的东西只会保持与 RTSP 流摄像机/服务器的一个连接,但允许 N 个客户端保持与它的 n 个连接:
+--->[RTSP client 1]
[input RT(S)P stream]--->[? magic thing ?]---+--->[RTSP client 2]
+--->[...]
+--->[RTSP client N]
什么软件可以做到这一点,和/或有什么库可以用来自己破解ti?
为此,我找到了一个(并且只有一个解决方案(,即 LIVE555 的代理服务器组件,但它有一个令人震惊的缺点,至少对我来说是这样:它根本无法很好地处理输入流的随机断开连接和暂停(这是一个要求,这需要与非常糟糕的相机一起工作,RT(S(P 的实现可能有问题, 偶尔会重新启动,并且连接非常不稳定 - 想想每 10 - 15 分钟关闭一次 3G 连接,持续 1-2 秒(。
我想知道也许我正在搜索错误的东西,此过程的错误名称,错误的关键字等,因为我只找到了一个可用的软件,即LIVE555代理-有人至少可以指出我找到解决方案的正确方向吗?
(注意:我更喜欢库或开源的东西,因为我还有一些额外的东西需要在上面构建,比如在连接断开时可能暂时用图像占位符流或其他"备份"流替换提要 - 但"正常工作"设备现在就足够了,一旦我解决了代理解复用问题,其他我可以添加为单独的服务。
我不知道有比live555代理更好的解决方案。我记得唯一的限制是代理AMR-NB音频,但我不记得问题是什么。
什么软件可以做到这一点,和/或有什么库可以用来自己破解ti?
代理服务器是建立在liveMedia代码库之上的代理。只需在其上构建自己的代理服务器即可。您可以使用代理服务器作为起点。
它根本无法很好地处理输入流的随机断开连接和暂停(这是一个要求,这需要与非常糟糕的相机一起工作,RT(S(P 的实现可能有错误,偶尔会重新启动,以及相当不稳定的连接 - 想想 3G 连接每 10 - 15 分钟关闭一次,可能持续 1-2 秒(。
您可以相当轻松地将自己的定期任务添加到单线程 liveMedia 事件循环中,该循环在摄像机重新启动、网络中断等情况下处理 RTSP 服务器重新连接。我以前使用过liveMedia代码来处理类似的问题。只需确保您符合 LGPL 许可证要求即可。
来自 playCommon.cpplivetestProgs
目录中的代码示例
int64_t uSecsToDelay = (int64_t)(secondsToDelay*1000000.0);
sessionTimerTask = env->taskScheduler().scheduleDelayedTask(uSecsToDelay, (TaskFunc*)sessionTimerHandler, (void*)NULL);
其中会话计时器处理程序声明为
void sessionTimerHandler(void* clientData);
LiveMedia基本上已经定义了回调机制。搜索TaskToken
,您会在源代码中找到许多进一步的示例。如果您使用的是Windows,请尝试找到基于CMake的live555分支来生成VS解决方案。在 Linux 上,有足够的其他工具。
我想知道也许我正在搜索错误的东西,此过程的错误名称,错误的关键字等,因为我只找到了一个可用的软件,即LIVE555代理 - 有人至少可以指出我找到解决方案的正确方向吗?
您正在寻找RTSP 代理,我知道没有更好的代理。您的搜索词没有错,周围根本没有很多开源(如果有的话(。不确定是否有商业变体。
live555 代码是
- 开源 (LGPL(
- 跨平台
- 经过尝试和测试(live555的各种用户已经发现/修复了许多问题(
- 积极维护
- 扩展起来相当简单
- 通过邮件列表提供支持。Ross Finlayson(作者live555(对邮件列表中发布的合理查询有相当快的响应时间。只是在发布时不要使用您的 gmail 地址:-(