java远程桌面实现

技术 Jan 28, 2020

突发奇想,使用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抓取屏幕像素生成webp格式图片文件通过io流传输到远程端之后显示出图片。

但java robot的效率低下。而且webp 格式的编码非常消耗cpu资源,如果真要用java来实现的话 可能需要寻找更加高效的抓取屏幕的方法和更加高效的编码。

webp格式的编码图片 编码耗时是jpg 接近几倍的时间消耗 虽然体积有所减少, 200kb的jpg,webp应该为150kb左右。但编码耗时却更长。

最后图片我采用的行程编码,并只传输robot 截图 rgb 位图中有改变的数据。但行程编码在遇到屏幕像素变化太大的情况 数据量急剧上升。我认为如果真要用图片来进行传输桌面信息。需要行程编码配合 jpg 或者 webp 格式进行编码传输。在屏幕像素变化较大的情况下直接使用 webp 进行整张图编码。在屏幕像素变化较小时 直接使用行程编码。

tanzhuo

咸鱼一只