把平板、手机作为电脑第二屏幕(Linux系统下)

将平板、手机作为电脑第二屏幕(Linux系统下)

背景

把手机、平板作为电脑第二屏幕是上个学期偶然想到的,那时我一边看网上的教程一边码代码。由于看的是视频教程,缩小了就看不清上面的字,放大了又会挡住打字区域。这时就想如果有个第二屏幕就很方便了,买个屏幕又不太方便,想到自己还有个平板天天吃灰,这不是就是现成的屏幕嘛。

在网上搜了搜发现真的有解决方案,windows和mac上有很多软件可以用,但我平时主要用的是Ubuntu系统,所以这里就讲一下在Ubuntu系统下要怎么做吧。

先决条件

网上目前能找到的解决方案都是基于Intel集显中的Virtualheads功能,所以如果你是用的 AMD 的 cpu 那肯定就用不了这个功能了,另外如果是有独显的电脑若要开启这个功能,需要把驱动切换为使用集显或干脆不装独显驱动,网上有使用 Intel 集显进行图形显示、NVIDIA 独显进行数据计算的教程,因为我没有这方面的需求就没有折腾。

下面是man手册中关于Intel集显的一些设置说明

Option “Virtualheads” " integer "

This option controls specifies the number of fake outputs to create in addition to the normal outputs detected on your hardware. These outputs cannot be assigned to the regular displays attached to the GPU, but do otherwise act as any other xrandr output and share a portion of the regular framebuffer. One use case for these extra heads is for extending your desktop onto a discrete GPU using the Bumblebee project. However, the recommendation here is to use PRIME instead to create a single Xserver that can addresses and coordinate between multiple GPUs.

Default: 0

大概意思就是可以创建虚拟的显示输出头(类似于电脑显卡上的那个接显示器的输出头),然后通过xrandr进行显示输出。

为了让显卡创建Virtualheads需要在X11的配置目录中添加相应的驱动配置。

注意!!! 如果当前使用的是独显必须先切换到集显再进行配置,否则重启后无法进入图形界面!!!

sudo vim /usr/share/X11/xorg.conf.d/20-intel.conf 把下列内容填入文件中

Section "Device"
    Identifier "intelgpu0"
    Driver "intel"
    Option "VirtualHeads" "1"
EndSection

其中Option中的VirtualHeads的值为1即创建一个虚拟输出头,也可以创建多个输出头,如把1改为4即可创建4个虚拟头。每个输出头可以对应一个屏幕,如果有一堆平板或手机也可以通过这个组建一个屏幕阵列。。。(画面会很卡)

配置好后需要重启电脑。如果开启了独显要么该功能无法用,要么驱动错误无法加载驱动进不去图形界面,需要进入恢复模式删除配置文件。所以务必关闭独显!!

重启后可以打开终端输入命令xrandr查看有没有开启成功。

若成功在输出内容的底部可以看到如图VIRTUAL开头的行:

xrandr

该命令显示了我电脑当前的显示状态,Screen 0 是当前正在显示的屏幕的分辨率参数,eDP1是笔记本内置显示屏当前的分辨率参数,下面的一堆数字是该显示屏所支持的分辨率及刷新率,最底下的三行分别是 HDMI 接口输出及虚拟输出,如果没有连接则会显示disconnect

开启扩展屏幕及虚拟显示器

使用cvt命令可以获取所需分辨率的相应配置信息

例如我想让平板分辨率为960x600,可以输入以下命令:

cvt 960 600

其输出为:

# 960x600 59.63 Hz (CVT 0.58MA) hsync: 37.21 kHz; pclk: 45.25 MHz
Modeline "960x600_60.00"   45.25  960 992 1088 1216  600 603 609 624 -hsync +vsync

其中第二行 Modeline 后面的内容是我们接下来需要的。

将其替代下面命令中的newmode后面的内容

# 产生一个新的分辨率模式
xrandr --newmode  "960x600_60.00"   45.25  960 992 1088 1216  600 603 609 624 -hsync +vsync

接下来启动该显示器

# 向虚拟显示器添加分辨率模式
xrandr --addmode VIRTUAL1  "960x600_60.00"
# 设置虚拟显示器与内置显示器的相对位置,这里我把虚拟显示器放在左下角
# 该命令可能需要重复输入两次才能生效
xrandr --output VIRTUAL1 --mode 960x600_60.00 --pos 0x480 --rotate normal --output eDP1 --primary --mode 1920x1080 --pos 960x0 --rotate normal

下面是启用扩展屏幕及虚拟显示接口后的xrandr输出结果:

在这里插入图片描述

可以看到现在Screen 0的分辨率为 2880 x 1080,eP1分辨率不变但其后的偏移量 + 0 + 0 变为 + 960 + 0 (即从Screen 0 宽为960高为0以后的部分进行切割分配给 eP1),注意到VIRTUAL1disconnected变为connected其分辨率为 960 x 600,其后的 + 0 + 480 为偏移量(即从Screen 0宽为0高为480以后的部分进行切割分配给 VIRTUAL1 )这样就实现了多个显示器共享同一个屏幕的功能。

此时打开设置->设备->显示器(系统为 Ubuntu 19.10、其他系统也有类似的设置)可以看到新添加的虚拟显示器。

在这里插入图片描述

X11VNC

有了虚拟显示器接下来我们要把虚拟显示器显示的内容映射到平板上了,实现虚拟屏幕的核心是VNC (Virtual Network Console)虚拟网络控制台技术,是一类远程控制技术,绝大多数Linux云主机上提供的图形界面的远程访问都使用了这个技术,简单来说vnc相当于不断发送屏幕截图。本文中我们使用 x11vnc 实现将 X11 的输出内容通过vnc进行发送。

安装x11vnc

sudo apt install x11vnc

设置访问密码:

x11vnc -storepasswd

通过下面的命令就可以把虚拟显示器的内容通过网络进行发送了:

x11vnc -rfbport 5900 -clip xinerama0 -wait 1 -defer 1 -nowf -sb 0

-rfbport:指定了连接所用的端口,默认为5900也可以自行设置。

-clip:该命令设置x11vnc映射屏幕的范围,可以使用-clip WxH+X+Y来手动设置映射范围,也可以使用-clip xinerama0来自动映射显示器,其中xinerama0为屏幕设置中从左往右数第一个显示器,以此类推xinerama1为第二个,如果你的主屏幕在左边虚拟屏幕在右边,那如果设置为xinerama0就会将主屏幕的显示内容复制到虚拟屏幕上,也就是两个屏幕的内容一样了,这时就应该设置为xinerama1

-wait:是两次屏幕抓取的时间间隔,默认为 20 ms 效果比较卡顿,设置为 1 的话会尽可能降低抓取时间减少延迟。

-defer:向vnc客户端发送更新的间隔,默认也为 20 ms,设置为 1 可以尽可能提高发送频率(但对网速的要求就高了)。

-nowf:在移动窗口到虚拟屏幕时显示内容,否则会显示为一个框。

-sb:设置休眠时间,默认为 60s 也就是如果屏幕 60s 内没有活动的话就停止数据传送,这样会导致有时鼠标从主屏移动到虚拟屏幕时会卡顿,设置为 0 后就不会休眠了。

还有其他很多选项,可以通过man x11vnc进行查看。

之后在手机平板上就可以通过vnc客户端通过电脑的ip地址及端口连接了。

在安卓设备上我推荐用 bVNC,在苹果设备上可以在商店里找找vnc的客户端(我没有苹果设备)。

bVNC 可以在应用商店里找,找不到的话可以下我网盘上的:https://share.weiyun.com/5fKmIiB

使用USB连接Android设备

虽然可以通过局域网连接,但有时没有局域网或网络不稳定时我们可以通过USB连接,该方法需要手机开启开发者模式允许USB调试。

安装adb相关工具

sudo apt install adb android-tools-adb android-tools-fastboot

通过adb的反向代理功能使手机通过USB连接。

adb reverse tcp:5900 tcp:5900

之后在安卓平板或手机上可以通过127.0.0.1:5900来访问。

平板、手机上使用 bVNC 来接收屏幕数据

打开 bVNC 软件后按下图填入连接信息点击 Connect 就可以连接了。

在这里插入图片描述

将平板变成电脑第二屏(Linux下)

用arandr来设置显示器间相对位置

另外推荐一个设置显示器分辨率及多个显示器相对位置的软件:arandr

sudo apt install arandr

使用这个软件可以很方便地设置显示器的摆放位置,并且可以生成配置脚本以备使用。

在这里插入图片描述

比如默认情况下虚拟显示器在内置显示器的右边,如果我想把它调到左边就可以拖过去,之后点击工具栏中的对号设置就可以生效了。

在这里插入图片描述

如果希望把配置保存下来可以点击布局->另存为,这样就可以把当前的配置以shell脚本的形式保存下来,下次想恢复到该配置模式只需要运行脚本即可。

生成的脚本的内容如下:

#!/bin/sh
xrandr --output VIRTUAL2 --off --output HDMI1 --off --output VIRTUAL1 --mode 960x600_60.00 --pos 0x480 --rotate normal --output eDP1 --primary --mode 1920x1080 --pos 960x0 --rotate normal

可以看到就是调用了xrandr来设置显示器相对位置。

网友开源软件

看到需要这么多步骤,是不是想放弃了呢。有网友已经把以上这些过程组合在一起写了一个很好用的软件:

GitHub地址:VirtScreen

除了显卡驱动部分必须按照 「先决条件」 手动设置外,其他部分都可以用这个软件来解决。

在这里插入图片描述

运行后会在系统托盘出现一个电脑形状的图标,点击后会弹出一个菜单:

在这里插入图片描述

点击 Open VirtScreen 后会弹出该程序的主界面:

在这里插入图片描述

其中 WidthHeight 就是你所希望的虚拟屏幕的分辨率,Portrait Mode 就是竖屏模式,HiDPI 就是把当前的分辨率长宽乘2。

Advanced 按钮一般不需要点,如果你启用多个虚拟显示器可以在这里选择你要输出的虚拟显示器。

之后点击 ENABLE VIRTUAL SCREEN 按钮就启动了虚拟屏幕。

启用后软件的图标会变成这样:
在这里插入图片描述

点击VNC会切换到VNC设置页:

在这里插入图片描述

首先我们要点击Advanced-wait 1 -defer 1 -nowf -sb 0填进去:

在这里插入图片描述

这样显示的画面就会流畅很多。

参考资料

https://github.com/brunodles/linux-second-screen/blob/master/tutorial.md

https://github.com/ChipTechno/Android-as-second-monitor-for-linux/blob/master/README.md

https://github.com/kbumsik/VirtScreen

https://github.com/mrenrich84/vnc_virtual_display_linker/blob/master/README.md


欢迎关注我的公众号 江达小记

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章