0

我即将在 C++ (windows/linux) 中为多个用户实现一个网络摄像头视频聊天系统。由于“普通”用户通常通过 DSL/电缆连接,因此我的(首选)TCP/IP 连接存在很大的带宽限制。

基本思想是在给定发送方带宽限制的情况下传输尽可能高的帧速率。(其他应用程序在后台可能仍需要 Internet 带宽。)在第二步中,相机捕获率应根据网络限制自动调整,以避免不必要的 CPU 开销。

我所拥有的是必须传输到远程端的压缩图像(具有强烈变化的缓冲区大小)的恒定流。假设有 20kb/s 的限制,我如何最好地实现该限制?(请注意,用户应定义此限制!)

提前谢谢,五月天

编辑:问题澄清(sry!)

  • 它是关于如何对任意 TCP/IP 连接进行流量整形。
  • 不是我的用例建议的如何实现图像速率/质量降低。(虽然我还没有考虑过自动调整图像压缩。(Thx Jon))
4

2 回答 2

0

您需要至少 3 帧的缓冲区/队列:

  • 当前正在发送到网络的一帧;
  • 接下来要发送一个完整的帧;
  • 当前正在从相机复制一帧。

当网络发送方完成发送帧时,它会将“下一个要发送”帧复制到“当前发送”槽。当相机阅读器完成从相机复制一帧时,它用复制的帧替换“下一个要发送”的帧。(显然,需要围绕“下一个发送”帧进行同步)。

然后,发送者可以根据需要调整其发送速率。如果它的运行速度比相机慢,它只会丢帧。

于 2010-12-22T23:40:00.673 回答
0

您可以做两件事来减少带宽:

  1. 发送较小的图像(更多压缩)
  2. 少发图片

在实现选择图像大小和数量以遵守用户选择的限制的算法时,您必须在简单/稳健的算法和高性能算法(最大限度地利用超出限制的算法)之间取得平衡。

我会尝试的第一种方法是使用您在任何时间点使用的带宽的滚动平均值来“播种”您的算法。每隔一段时间,检查一下平均值。如果它超过您的限制,请指示算法使用更少(与您超出限制的程度成正比)。如果它显着低于您的限制,比如低于 90%,请指示算法使用更多。

更少/更多指令可能是您的算法用来决定的变量(可能是intfloat,这里确实有很大的创造性空间):

  1. 多长时间捕获一次图像并发送一次
  2. 压缩该图像有多难
于 2010-12-22T13:32:32.380 回答