Linux上利用sunshine串流和虚拟显示器实现副屏扩展
- 场景:Linux + Wayland,尝试将空闲的android平板作为扩展显示屏
1. 方法
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 文件放置在
/usr/lib/firmware/edid/目录下(如果没有的话创建)
- 编辑
/etc/default/grub文件,在GRUB_CMDLINE_LINUX_DEFAULT=中添加drm.edid_firmware=HDMI-A-1:edid/<EDID> video=HDMI-A-1:e
- 其中
<EDID>为上一步放置在/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 端会产生下图情况
- 当前解决方法是通过降低分辨率实现放大效果
![image]()
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音频输出问题
3. notes
- 系统每次重启时显示器接口对应编号顺序会变,可能需要在sunshine WebUI
Configuration # Audio/Video # Display number 中重新设置对应编号
- 如果在 x11 下使用,需要调整
Configuration # Advanced # Force a Specific Capture Method,一般设置为 Autodected 即可
参考