3

我正在创建TCP远程桌面广播应用程序。(类似于 Team Viewer 或 VNC)服务器应用程序将

1. run on a PC listening for multiple clients on one Thread
2. and on another thread it will record the desktop every second
3. and it will broadcast the desktop for each connected client.

我需要使这个应用程序能够在具有 12KBps 上传和 50KBps 下载 DSL 连接(客户端和服务器)的连接上运行。

所以..我必须减少每秒发送的数据/图像的大小。

我试图通过执行以下操作来减少。

I. first i send a Bitmap frame of the desktop and each other time i send only the difference of the previously sent frame.

II. the second way i tried was, each time i send a JPEG frame.

我未能成功发送 JPEG 帧,然后每次下一次发送之前发送的 JPEG 帧的差异。

当我传输位图的差异时,我尝试使用lzma压缩(7zip SDK)。

但我未能将数据减少到 12KBps。我能够达到的最大值约为 50KBps。

有人可以建议我这样做的算法/程序吗?

4

1 回答 1

11

您想要做的是执行图像压缩格式所做的事情,但是以自定义方式(仅发送更改,而不是一遍又一遍地发送整个图像)。这是我要做的,分两个阶段(阶段1:完成,证明它有效,阶段2:优化)

概念证明阶段

1) 以位图格式捕获屏幕图像

2) 将图像分割成连续字节的块。您需要四处寻找最佳块大小是多少;它会因上行链路/下行链路速度而异。

3)为每个块获取一个短哈希(crc32,也许是 md5,也可以尝试一下)

4)压缩(不要忘记这样做!)并传输每个更改的块(如果哈希更改,则块更改并需要传输)。在接收端将图像拼接在一起以显示它。

5)使用UDP数据包进行数据传输。

优化阶段

您可以采取以下措施来优化速度:

1) 收集统计数据和硬代码传输速度与帧大小和哈希方法,以获得最佳传输速度

2)为#1建立一个自我调整机制

3) 正如我在上面第一阶段的#2 中解释的那样,图像在方形区域而不是连续的字节块中压缩得更好。改变你的算法,让你得到一个可视的正方形区域,而不是连续的线条块。这个平方的方法就是图像和视频压缩的人怎么做的。

4)玩弄压缩算法。这将为您提供很多变量(CPU负载vs互联网访问速度vs压缩算法选择vs屏幕更新频率)

这基本上是(大致)压缩视频流如何工作的总结(如果您考虑一下,您可以看到与您的任务的相似之处),因此这不是一个未经证实的概念。

高温高压

编辑:您可以尝试的另一件事:捕获屏幕的位图后,减少其中的颜色数量。例如,如果从 32 位颜色深度变为 16 位,则可以节省一半的图像大小。

于 2010-11-04T15:52:13.870 回答