将平闆、手機作為電腦第二螢幕(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開頭的行:
該指令顯示了我電腦目前的顯示狀态,
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
),注意到
VIRTUAL1
由
disconnected
變為
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 後會彈出該程式的主界面:
其中
Width
和
Height
就是你所希望的虛拟螢幕的分辨率,
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
歡迎關注我的公衆号 江達小記