日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Sunshine + Moonlight 纯软件实现全平台设备作 Linux 副屏

發布時間:2024/1/16 linux 32 coder
生活随笔 收集整理的這篇文章主要介紹了 Sunshine + Moonlight 纯软件实现全平台设备作 Linux 副屏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄
  • 初識 Moonlight
  • 部署 Sunshine 服務端與 Moonlight 客戶端
  • 創建虛擬顯示屏
    • 寫一個創建屏幕的腳本(可選)
  • 將副屏進行串流
  • 已知問題

最近,我想要通過視頻學習一些技術知識,作為筆記本用戶,沒有外接屏幕顯然是十分痛苦的,需要不斷切換窗口,并且還會互相遮擋。于是我便萌生了使用身邊的平板和手機作為副屏的想法。經過一番查找,發現各種千奇百怪的方法,有的付費,有的卡頓,最主要的就是:大部分方案是基于 Windows 系統的。在其中,我發現 Moonlight 串流方案基于全平臺。在此基礎上,我解決了一些問題,成功完成副屏延伸。

在本文中,Moonlight 只是一種串流方案,其實并非本文的重點。想知道重點在哪里嗎?那就接著往下看!

初識 Moonlight

在完成一系列副屏投屏操作前,我還是先簡單介紹一下 Moonlight,這是一個串流軟件,可以接收電腦屏幕上的內容和聲音,并且可以反過來操控電腦。首先先要了解一點的是:Moonlight 是一個客戶端軟件,換句話說就是,Moonlight 應該安裝在手機平板之類的“主控機”上,而不是像我電腦那樣的“受控機”。那么顯然,想要接收到電腦發出的串流信息,電腦本身必須要有一個服務端軟件來發送串流。下面就是一個大坑。

我第一次接觸到 Moonlight 的時候,是在研究 Steamlink 的平替,那個時候,我想要一個不同于 Steamlink 的方案,用來手機連接電腦玩一些 steam 上的視覺小說游戲 (嗯,也就是 galgame),而網上有關方案,大部分都推薦 Moonlight,但是所有這類文章,無一不陳述一個所謂的建議:建議使用 N卡 的用戶使用 Moonlight 串流,并且開啟 Nvidia Geforce 上的一個 SHIELD 功能,利用那個玩意作為電腦上的串流服務端,配套上如今 SHIELD 功能消失的解決方法,可謂井井有條,方案詳細。一言以蔽之:脫褲子放屁

原諒我話說那么難聽,但是鋪天蓋地的 Nvidia Shield 的方案不僅難用,而且缺少了國內的支持,最主要的是我當時沒有成功串流,只好放棄 Moonlight 方案,繼續 Steamlink。如此方案,混淆了我的視聽,讓我沒能深究背后的那個備用方案。直到我更換了 Fedora 這個 Linux 發行版作為主力操作系統,我在很清楚 Linux 上面沒有 Nvidia Geforce Experience 這個軟件的情況下,排除了一切有關這個的方案繼續探究 Moonlight,這才找到 Moonlight 是有一個配套的服務端 —— Sunshine 的。

很顯然,作為一個連接串流用的軟件,有一個專用的配套的服務端,才更加符合我們的常識。事實也證明了,局域網下 Sunshine + Moonlight 方案,擁有無異于物理顯示屏的體驗

部署 Sunshine 服務端與 Moonlight 客戶端

想要完成副屏的連接,第一步就是要完成手機與電腦間最最最基本的串流,也就是同屏串流。其基本效果和 Steamlink 一致,都是能將電腦的視頻音頻轉發到手機上,并且手機上也有辦法操控電腦。現在可以在我們的 Linux 系統上部署 Sunshine 服務端了。

首先我們來到 Sunshine 的 Github 官網:https://github.com/LizardByte/Sunshine/releases,可以看到有幾十種不同的發行包,支持 Linux 各大發行版和 Windows 版本,不確定支不支持 MacOS。但最重要的是,無論是 Sunshine 還是 Moonlight,都提供 AppImage 版本的軟件包,不同于各大發行版上的包管理器,這種軟件包是真正意義上的跨發行版,全 Linux 統一使用。因為我使用的是 Fedora 39, 不確定用官方提供的 38 版本的包會不會出問題,就統一采用了 AppImage 包。現在,下載下來改個名字放在你用戶的 bin 目錄下。

mv ~/下載/sunshine.AppImage ~/bin/sunshine
chmod 755 ~/bin/sunshine	# AppImage 程序可以直接終端運行,但是先給個執行權限。很慚愧,我自己為了圖省事,全部給的是777權限。

本例中的 ~/bin/ 目錄應當是一個你方便管理的,并且處在 PATH 環境變量下,方便你直接終端輸入運行。在我的電腦上,我設置為 ~/bin 而不是 ~/bin/.local/bin來方便我管理。如果你采用的是 zsh 作為 默認 shell, 你可能已經把這個目錄作為執行目錄了,請自行 echo $PATH 查看。

接下來,終端運行 sunshine 命令,你就會發現你桌面右下角的系統托盤上多了一處地方,可以右鍵打開 web 管理器。為什么要這么描述?因為在我的電腦上,sunshine 在系統托盤上根本沒有圖標。

(剛換 Linux, 這上面的 qq 截圖死活截不到右鍵菜單,無奈,請選擇你的拍屏導師.jpg)

點擊任務欄上面的那個 Open Sunshine,你就會被跳轉到 Sunshine 的web 管理頁面,會要求你新建一個賬戶和密碼。這一套賬號密碼是用來以后登陸后臺管理的,與 Moonlight 主控機那邊無關。畢竟串流相當于全權交出電腦管理權限,web 頁面的端口號要是爆了,能訪問到你電腦的陌生設備可就能來幫你管理電腦了,所以設置賬號密碼也很重要。

ps:你要是忘了賬號密碼,可以直接終端輸入 sunshine --creds 重置新的賬號密碼。

其實挺好玩,畢竟這一套帳密系統說是有賬號密碼,其實就是要你依次輸入兩個密碼,我看不到賬號的作用在哪里。

然后就是 Moonlight 主控端了,在任意一個你想要作為副屏的設備,比如手機、安卓平板、ipad、另一臺電腦、甚至是 Steamdeck 和 Switch,都可以下載安裝 Moonlight。各個平臺不再贅述,操作方法大同小異。在安裝完成 Moonlight 后,先確保設備和電腦連接在同一個路由器下,然后,打開 Moonlight ,等待軟件找到你的電腦 Host。如果找不到,直接 IP 連接也是一個好主意。

如果你在確認同一個網段下,確實無法連接到電腦,可以選擇檢查你電腦的防火墻設置。和 Windows 下的防火墻不一樣,Linux 下的防火墻是基于端口和 tcp/udp 協議的。畢竟個人桌面電腦不會跑什么公網服務,為了圖省事,我直接把 firewalld 給 disable 了。

當你第一次連接到電腦時,Moonlight 會給出一個 PIN 碼要求服務端確認。你可以點擊右下角的彈窗提醒,也可以手動進入到 web 后臺輸入 PIN 碼。

根據終端命令給出的提示,你似乎還可以通過 sunshine -0 xxxx 這樣的方式在終端輸入 PIN 碼來連接,但是我還沒有測試。

如果一切順利,你應該能夠看到手機和電腦的畫面同步了,并且手機上滑動屏幕還能操控鼠標移動。如果手機或平板有外接鍵盤,你甚至可以用那個鍵盤來打字。

創建虛擬顯示屏

如果你是試圖在 Linux 上串流游戲的,那么到這也就結束了。但我們目的并不停滯于此,我們想要的是一個副屏,能夠把手機平板當作電腦顯示屏的方案。很明顯,我們現在只能手機電腦同步畫面,想要一個新的顯示屏用來串流,我們采用什么方法呢?這才是本文的重點

在網上一部分的教程中,有人提出使用 HDMI 欺騙器用來創建一個屏幕。作為 Linux 系統,幾乎所有設備都可以虛擬一個,那么還要連接一個欺騙器的方案肯定不符合我們的預期,我們需要一個純軟件的方案。一部分教程給出了一些第三方虛擬屏幕軟件,基本都是 Windows 下的,既然是設備層面地去虛擬一個顯示器,用 wine 去兼容的方案肯定不符合預期。還有一個方案提出下載一個叫 virtscreen 的應用,它有 AppImage 的包,很可惜它無法在我的設備上運行,即使我的系統完全符合要求,更何況這個軟件局限于 Xorg 的 X11 桌面,不支持 Wayland。

最后,我在一個叫做 deskreen 的副屏方案的 issue 區找到了一個建立副屏的方案:https://github.com/pavlobu/deskreen/issues/42。他采用了 Linux 下 X 桌面原生的屏幕管理器 xrandr

。雖然同樣不支持 Wayland,但是我相信 Wayland 下一定有一個對位的管理器可以用類似的方法實現本文方案。

據 千雪的咖啡廳 博客下描述,Wayland 用戶應該可以用一個叫做 krfb-virtualmonitor 的命令行工具來創建虛擬顯示屏,有可能比 X11 還要快。

這里提到了 deskreen 這個方案,但是我沒有使用,可能是因為我不太喜歡用 web 這樣的形式來擴展副屏,顯得怪怪的。

現在我們打開終端,輸入 xrandr ,就可以看到 X11 桌面下,你目前已經連接了幾個顯示屏。在正常情況下,你一般只會有一個顯示屏顯示 connected

在我的電腦上,顯示已經連接了一個叫做 eDP 的屏幕,緊跟著一堆 DisplayPort ,因為我的電腦是筆記本,所以是這個樣子。根據電腦不同,這些名字還可能會有諸如 HDMI-0DVI-D-0 之類的設備名。

在圖中,我們還能看到 DisplayPort-0 下面已經有了一個類似分辨率的東西,這是因為我已經配置完了,否則這一項會和下面的 1-7 完全一樣。在這里你也能看到 165.00 旁邊有一個 * 號,這表示這塊屏幕已經向外輸出視頻了。

在這里,我們采用的是現有的未連接通道,如果你不想要如此使用,而是自己虛擬一個顯示屏,又或者是確實沒有空余的未連接通道,你可以移步至千雪大佬的博客:千雪的咖啡廳,那里會有新建一個顯示屏的方法

xrandr --addmode DisplayPort-0 1920x1080 
xrandr --output DisplayPort-0 --mode 1920x1080 --left-of eDP

核心命令就是這么兩行,不要直接復制粘貼,請先往下看,然后根據自己的電腦情況修改參數

其中第一行表示給 DisplayPort-0 添加一個分辨率 mode,然后第二行就是要求這塊屏幕輸出內容了。那么這塊屏幕應當與主屏幕連接以作為副屏使用,我們需要為它安排一個位置,注意最后兩個參數 --left-of eDP ,很好理解,第一個參數就是表明我們創建的新屏幕應當放在第二個參數(我們主屏幕)的哪一個方位。本例中就是把副屏放在主屏幕的左邊。這個方位一般有四種:--left-of--right-of--above--below,這四個參數顧名思義,不多解釋。

當你敲完第二個命令的時候,你的屏幕應該會閃爍一下,就跟 Windows 下調整完顯示設置那樣,整個桌面都刷新了。加入你設置的參數是 --left-of ,那么你把鼠標往最左邊移動,就會發現左邊的屏幕打通了,可以多往左移動一大段距離,再移回來。很明顯,已經成功創建了一個虛擬屏幕。

如果你想關掉這個屏幕,也就是停止輸出,可以執行:

xrandr --output DisplayPort-0 --off

寫一個創建屏幕的腳本(可選)

這里的一切關于屏幕的改動都不是持久的,也就是說,電腦重啟,甚至是桌面重啟都會導致設置丟失,新屏幕消失不見。為了方便我們動態管理屏幕,我們不采用持久化的處理,而是寫一個方便自己管理的腳本。于是,我利用我學習 shell 時長不到 10min 的技術,勉強寫了一個能用的腳本,但確實方便很多。

#!/bin/bash
xrandr --addmode DisplayPort-0 1920x1080 # 該腳本下所有命令重復執行都是安全的,所以我把這句話直接放在了第一行
if [ $# != 1 ]
then
        vmonitor --help
elif [ $1 == "below" ]
then
        xrandr --output DisplayPort-0 --mode 1920x1080 --below eDP
elif [ $1 == "left" ]
then
        xrandr --output DisplayPort-0 --mode 1920x1080 --left-of eDP
elif [ $1 == "right" ]
then
        xrandr --output DisplayPort-0 --mode 1920x1080 --right-of eDP
elif [ $1 == "above" ]
then
        xrandr --output DisplayPort-0 --mode 1920x1080 --above eDP
elif [ $1 == "off" ]
then
        xrandr --output DisplayPort-0 --off
elif [ $1 == "--help" ]
then
        echo "  參數:"
        echo "  below           在主屏幕下方創建一個虛擬屏幕"
        echo "  above           在主屏幕上方創建一個虛擬屏幕"
        echo "  left            在主屏幕左方創建一個虛擬屏幕"
        echo "  right           在主屏幕右方創建一個虛擬屏幕"
        echo "  off             關閉虛擬屏幕"
else
        vmonitor --help
fi

然后我再把這個腳本軟連接到 ~/bin 下,這樣一來,我就可以方便的用類似于終端命令的方法去快速地創建虛擬屏幕了。比如 vmonitor left 或者是 vmonitor off。各位可以自己去自定義。

將副屏進行串流

現在便是我們的最后一步。我們創建好了一個副屏,鼠標也是順利地進入了那塊地方,但是我們卻沒有辦法看到。現在,拿出平板放在一邊,我們要進入 Sunshine 去設置串流位置,也就是說讓平板能夠顯示我們的副屏。

首先是在終端打開 Sunshine, 觀察它的輸出信息,可以看見有一列的顯示屏編號:

可以看到,我們的 DisplayPort-0 在終端上顯示為 1 號,記錄一下,這將是我們串流的默認通道。

然后進入到 Sunshine 的 Web 后臺,找到顯示器設置,將你的顯示器編號輸入進去。

(可以看到紅框部分也是提示了我們,顯示器編號應該去哪里找)

現在,重啟平板上的 Moonlight,重新連接電腦,你就會發現一件奇怪的事——平板黑屏了。如果你把鼠標移過去倒也能看到鼠標,但是就是沒有畫面。

其實這個問題倒也不是問題,如果你曾經因為桌面卡死而執行過 killall plasmashell 這種命令就會知道,其實只是沒有桌面系統,也就是任務欄、桌面圖片和一些控件,但是已經開啟了的應用是可以在上面運行的。換句話講,你現在把你主屏幕上的一些應用直接拖到左邊副屏上,就已經可以使用了!

大功告成!!!

已知問題

在測試途中,倒也發現了一些問題。

首先就是在 Moonlight 連接狀態時,如果你像我一樣寫好了 vmonitor 腳本,并且依次執行 vmonitor offvmonitor left 就會發現副屏切換回主屏幕界面,然后再切回副屏界面,所有應用保存在副屏。這個很符合預期。

但是,如果我們在已經關閉了副屏的基礎上,也就是 vmonitor off 的情況下,在終端運行了 sunshine ,很有可能會造成 KDE 卡死,除了鼠標所有東西都不動了。我的解決方案是:切換到 TTY 下,運行 sudo systemctl restart sddm 來重啟窗口管理器解決問題,代價就是一些已經開好了的桌面應用需要重新開啟。

因此,每次開啟電腦或是重啟桌面后,必須先要運行 xrandr 命令,或是像我那樣的 vmonitor 腳本,再運行 Sunshine, 防止桌面卡死。

第二點就是在 Moonlight 串流成功后,電腦會首先將聲音揚聲器轉移到 Moonlight 控制端,也就是平板發出了聲音。如果我再在任務欄將聲音通道轉回來,我的電腦會恢復發出聲音的情況,但是我的平板并不會停止發出聲音。我在聲音設置下將除了耳機以外所有音頻通道全部靜音也無濟于事。我的解決方案便是將平板在物理層面上靜音,也就是設置設備的揚聲器。

文章原地址:https://www.sxrhhh.top/blog/2024/01/16/sunshine-moonlight-to-create-a-virtual-monitor/


作者:Sxrhhh

個人網站:https://www.sxrhhh.top

博客園:Sxrhhh - 博客園 (cnblogs.com)

轉載請注明出處.

在個人網站持續更新中……

總結

以上是生活随笔為你收集整理的Sunshine + Moonlight 纯软件实现全平台设备作 Linux 副屏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。