天天看點

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(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開頭的行:

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

該指令顯示了我電腦目前的顯示狀态,

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

輸出結果:

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

可以看到現在

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、其他系統也有類似的設定)可以看到新添加的虛拟顯示器。

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

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系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

将平闆變成電腦第二屏(Linux下)

用arandr來設定顯示器間相對位置

另外推薦一個設定顯示器分辨率及多個顯示器相對位置的軟體:arandr

sudo apt install arandr
           

使用這個軟體可以很友善地設定顯示器的擺放位置,并且可以生成配置腳本以備使用。

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

比如預設情況下虛拟顯示器在内置顯示器的右邊,如果我想把它調到左邊就可以拖過去,之後點選工具欄中的對号設定就可以生效了。

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

如果希望把配置儲存下來可以點選布局->另存為,這樣就可以把目前的配置以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

除了顯示卡驅動部分必須按照 「先決條件」 手動設定外,其他部分都可以用這個軟體來解決。

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

運作後會在系統托盤出現一個電腦形狀的圖示,點選後會彈出一個菜單:

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

點選 Open VirtScreen 後會彈出該程式的主界面:

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

其中

Width

Height

就是你所希望的虛拟螢幕的分辨率,

Portrait Mode

就是豎屏模式,

HiDPI

就是把目前的分辨率長寬乘2。

Advanced

按鈕一般不需要點,如果你啟用多個虛拟顯示器可以在這裡選擇你要輸出的虛拟顯示器。

之後點選

ENABLE VIRTUAL SCREEN

按鈕就啟動了虛拟螢幕。

啟用後軟體的圖示會變成這樣:

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

點選

VNC

會切換到

VNC

設定頁:

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

首先我們要點選

Advanced

-wait 1 -defer 1 -nowf -sb 0

填進去:

把平闆、手機作為電腦第二螢幕(Linux系統下)将平闆、手機作為電腦第二螢幕(Linux系統下)

這樣顯示的畫面就會流暢很多。

參考資料

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

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

繼續閱讀