把平板、手機作爲電腦第二屏幕(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


歡迎關注我的公衆號 江達小記

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