C#更好的压缩远程桌面广播应用程序

时间:2010-11-04 15:33:15

标签: c# compression video-streaming remote-desktop mpeg

我正在创建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)来传输Bitmap的差异。

但我没有成功将数据减少到12KBps。我能达到的最大值约为50KBps。

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

1 个答案:

答案 0 :(得分:9)

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

概念验证阶段

1)以位图格式

捕获屏幕图像

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

3)为每个块获取一个简短的哈希值(crc32,也许是md5,也可以用这个实验)

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

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

优化阶段

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

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

2)为#1

制定自我调整机制

3)图像在方形区域中压缩得更好,而不是连续的字节块,正如我在上面第一阶段的#2中所解释的那样。更改算法,以便获得视觉方形区域而不是连续的线条块。这种方形方法是图像和视频压缩人员如何做到的。

4)使用压缩算法。这将为您提供许多变量(CPU负载与互联网访问速度对比压缩算法选择与屏幕更新频率)

这基本上是(粗略地)压缩视频流如何工作的总结(如果你考虑的话,你可以看到你的任务的相似性),所以这不是一个未经证实的概念。

HTH

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