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

标签 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)。

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

有人可以建议我执行此操作的算法/程序吗?

最佳答案

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

概念验证阶段

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

2) 将图像分成连续字节 block 。您需要尝试找出最佳 block 大小;它会因上行链路/下行链路速度而异。

3) 为每个 block 获取一个短散列(crc32,也许是 md5,也可以试验一下)

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

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

优化阶段

这些是您可以优化速度的事情:

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

2) 为#1做一个 self 调整机制

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

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

这基本上是对(粗略)压缩视频流的工作原理的总结(如果你仔细想想,你会发现与你的任务有相似之处),所以这不是一个未经证实的概念。

HTH

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

关于C# 更好地压缩远程桌面广播应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098322/

相关文章:

C# 数据集 Access 数据库

c# - 为什么 C# 编译器不会对具有默认参数的方法感到困惑?

c# - 要分割的正则表达式 ;

算法挑战 : Arbitrary in-place base conversion for lossless string compression

algorithm - 从输入和输出字节确定压缩算法

c# - 实时视频流快速编码

c# - 类监视器作为普通类

c# - GZIPStream 压缩总是返回 10 个字节

安卓 + Wowza + RTSP。玩的不错,但是无法控制MediaController

c++ - 加入编码视频帧