c - 在不同平台上流式传输桌面以提高速度

标签 c bitmap cross-platform screen-capture

我需要用“C”语言创建一个在各种平台(linux、freebsd、windows...)上编译的小型远程桌面软件我已经研究了一段时间的各种图像格式,但仍然无法实现想出一个使用它们的好主意,现在,这就是我所做的:

1. Convert All Formats into Windows Bitmap (XImage,...etc)
2. Do a byte-to-byte comparion and replace the identical bytes with zeros
3. Preform a RLE (Run Length Encoding) on the Resulted data.
4. Transmit the Packet to the Server
5. Inverse the Operation on the Server by Reconstructing the Image through the previous image (Comparing Last Image with the New one Discarding Zero Bytes after RLE)

但这往往非常慢,因为位图图像格式已经有非常大的文件,因为它不包含压缩,并且在 Mac OS X 等平台上,位图大小由于非常高的分辨率而大得离谱。

有没有更快更好的方式进行桌面流式传输?

最佳答案

对于计算机屏幕,您可以考虑一些事项,主要是屏幕上只有一小部分可以随时更改。

你可以看看这三种方法:

  1. 将屏幕分成矩形,因为每次屏幕更新只传输那些随着它们的位置发生变化的内容。
  2. 使用压缩图像格式,如 png 或 jpeg,或使用 zlib 压缩位图而不是 RLE。
  3. 在捕获图像时降低图像的颜色深度,将图像降低为 4 位或 8 位颜色将大大减少您发送的数据量以及您必须比较更改的数据量。

根据您想要编写服务器的方式,您可能能够从操作系统获得有关屏幕的哪些位已更改的提示,以减少您必须执行的处理量。

最后,(如果这不是家庭作业)然后查看类似 VNC 的内容已经做得很好,甚至有 java 或 c# 版本。

关于c - 在不同平台上流式传输桌面以提高速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9273240/

相关文章:

C 编程 - 将一个单词添加到数组中,然后打印数组中的内容

c - 位图加载器无法正确显示颜色

android - 矢量图形在 Android 中比位图慢吗?

java - 我如何追踪哪个图像是我的应用程序的 killer ?

c - C 语言编程 - Linux 和 OSX 之间的差异

c++ - 为每个操作系统创建单独的项目还是将它们全部混合到一个项目中更好?

c - 用户输入特定数量的整数后如何停止 scanf 循环?

创建定制的 S 功能 block ,并使用实时车间生成相同的 C 代码

c - 生成一个没有给定数字的随机数

docker - Docker构建在Azure DevOps上失败