Linux上利用sunshine串流和虚拟显示器实现副屏扩展
十一月 22, 2025 [网络与安全] #Git #Linux #obsidian #密码学 #桌面应用Linux上利用sunshine串流和虚拟显示器实现副屏扩展
- 场景:Linux + Wayland,尝试将空闲的android平板作为扩展显示屏
1. 方法
- 根据 https://www.w568w.eu.org/spacedesk-on-linux.html 中的描述,利用 sunshine + moonlight 串流以及虚拟显示器欺骗实现副屏扩展
1.1 设置虚拟显示器
-
查看当前系统记录的显示器设备接口的连接情况,使用命令
for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done;选取一个标记为disconnected的空闲接口(如HDMI-A-1) -
按需获取一个 EDID 文件,注意选取的 EDID 要支持上一步选择的空闲端口的类型
-
可用的 EDID 文件仓库
-
对于 HDMI 接口,AOC model3277型号显示器的EDID文件中可用的分辨率、刷新频率配置选项比较全面
-
EDID 文件内容也可以使用 cur、wxedid 等工具自行修改,比较麻烦
-
-
将获取的 EDID 文件放置在
/usr/lib/firmware/edid/目录下(如果没有的话创建) -
编辑
/etc/default/grub文件,在GRUB_CMDLINE_LINUX_DEFAULT=中添加drm.edid_firmware=HDMI-A-1:edid/<EDID> video=HDMI-A-1:e- 其中``为上一步放置在
/usr/lib/firmware/edid/目录下的 EDID 文件名(文件名没有限制,可以重命名),HDMI-A-1位置为选择的空闲接口
- 其中``为上一步放置在
-
执行
sudo update-grub更新grub配置,然后重启系统使更改生效 -
重启后检查系统设置界面,如果设置中认为连接了一个新的显示器,证明虚拟显示器配置成功
- 在 Wayland 下,如果不需要使用虚拟显示器可以直接在设置中关闭
1.2 sunshine + moonlight安装与配置
-
电脑上安装 sunshine,平板上安装 moonlight
- 对于 sunshine,安装后首次进入 WebUI 时会提示创建账户
sunshine配置
- 在 sunshine WebUI
Troubleshooting # Logs中找到KMS Monitor List,从中获取虚拟显示器接口对应的编号,将 sunshine WebUI 中Configuration # Audio/Video # Display number设置为对应编号 - 对Configuration中其他选项按需调整
- 保存并应用 sunshine 配置更改
- 如果系统使用ufw,需要开放sunshine WebUI
Configuration # Network下显示的端口族以允许 moonlight client 端发起连接
moonlight配置
- moonlight中可以调整视频分辨率、视频帧数等
2. problems
2.1 虚拟显示器缩放带来的moonlight端问题
-
当前配置时发现,在系统设置界面对虚拟显示器进行设置如果调整了缩放(不是100%),在扩展屏上最大化edge、vscode、obsidian 等应用窗口会在 moonlight client 端会产生下图情况
- 当前解决方法是通过降低分辨率实现放大效果
📄 [图片文字版] Obsidian 笔记截图,副屏扩展配置步骤:获取显示器对应的 EDID 文件放入 /usr/lib/firmware/edid/;在 grub 内核参数添加 drm.edid_firmware=HDMI-A-1:edid/<文件名>,update-grub 后重启;电脑装 sunshine、平板装 moonlight,在 sunshine WebUI 用 KMS Monitor List 查虚拟显示器编号填入 Display number,ufw 放行端口。
- 当前解决方法是通过降低分辨率实现放大效果
2.2 moonlight端黑屏问题
-
本机环境:Ubuntu 24.04、linux 6.11.0、Wayland、iGPU(i915)+dGPU(GTX1650, Nvidia Driver 535.183.01),偶尔遇到 moonlight client 端黑屏情况,log记录显示
Error: GL: /build/sunshine/src/platform/linux/graphics.cpp:557: [00000502],github上有类似的issue:[1]https://github.com/LizardByte/Sunshine/issues/2390 、[2]https://github.com/LizardByte/Sunshine/issues/3586 -
尝试解决:根据 [1] 中的讨论,在 sunshine WebUI 中将
Configuration # Advanced # Force a Specific Capture Method指定为KMS,将Configuration # Advanced # Force a Specific Encode指定为VA-API或Software可以避免该情况-
Force a specific Capture Method中,Nvidia + Wayland 下只有KMS选项可用,NvFBC 需要 nvlax patch 支持,其余不行 -
Force a Specific Encoder中,可行的有VA-API和Software,NVIDIA NVENC不可用(下面描述)VA-API: 选择该项时需要通过vainfo --display drm --device /dev/dri/renderD*命令找到哪个显卡设备支持VA-API,然后在Configuration # Audio/Video # Adapter Name中设置Software: 通用选项,但可能带来编码速度和质量方面的影响NVIDIA NVENC: 选择此项运行时在sunshine的log中会显示"Warning: Client requested reference frame limit, but encoder doesn't support it!",moonlight client 端会因长时间无视频输出而中止串流Configuration中对三类Encoder都提供了相关设置
-
2.3 sunshine音频输出问题
- 刚实现副屏扩展时,接入副屏sunshine会自动将音频输出切换到sink-sunshine-stereo,在平板上播放声音;后续尝试解决时,发现音频输出自动切换仍然存在,但副屏设备没有了音频输出,这与github上的一个discussion(https://github.com/loki-47-6F-64/sunshine/discussions/173)比较类似,但目前没法解决
- 可能出现所有通道没有实际的音频输出情况,需要系统重启解决
3. notes
- 系统每次重启时显示器接口对应编号顺序会变,可能需要在sunshine WebUI
Configuration # Audio/Video # Display number中重新设置对应编号 - 如果在 x11 下使用,需要调整
Configuration # Advanced # Force a Specific Capture Method,一般设置为Autodected即可
参考
- https://www.w568w.eu.org/spacedesk-on-linux.html
- https://www.reddit.com/r/linux_gaming/comments/199ylqz/streaming_with_sunshine_from_virtual_screens/
- https://github.com/LizardByte/Sunshine/issues/2390
- https://github.com/LizardByte/Sunshine/issues/3586
- https://github.com/loki-47-6F-64/sunshine/discussions/173