Java远程桌面实现

突发奇想,使用java是否可以实现远程共享桌面的功能呢?

当然可以了,都是跑代码,但是java效率比较低,为啥,也不是因为java代码执行效率低下,而是因为出于Java自带的屏幕截屏工具效率过低,java提供了robot类来实现桌面截屏,2k屏幕一张jpg大小在200kb左右,一张截图我使用的rx2700x cpu 一张截图竟然需要30毫秒 距离1秒30帧率还是差距有的,更别提1秒60帧率。就算如果1秒60帧率 如何使用 java 高效的传输到各个远程端呢 ?

有人会说使用多线程截图,来提高帧率,这样的做法,我个人觉得不太科学,为啥?因为占用太高cpu资源,应该寻找高效并占用cpu资源较少的方法。

并且图片传输不可取,因为一张图片太大 ,200kb,1s 30张就是 6000kb 严重占用带宽。

最好的方式使用视频流,使用开源的h.264视频格式,还有更好的h.265 但是我并没有找到对应的开源jar。h.265技术还处于收费阶段。h.264视频格式 为根据每一帧中的像素点变化来记录其数据。而不需要记录整个图片中绝大部分像素信息。所以h.264格式的视频体积远远小于图片传输的数据总和。更加利于网络传输。

通过录制桌面的方式,有效推流到客户端,可以大大降低图片带来的带宽和截屏的效率问题,但是使用视频流的话,实时转码与流量都是一个不小的挑战。

最终我采用的是行程编码,并只传输 robot 截图 rgb 位图中有改变的数据。但行程编码在遇到屏幕像素变化太大的情况 数据量体积急剧上升。我认为如果真要用图片来进行传输桌面信息。需要突破java获取的屏幕像素数据效率以及数据传输的体积压缩最小化,才能保证远程桌面的帧率最高。