Linux上利用sunshine串流和虚拟显示器实现副屏扩展

  • 场景:Linux + Wayland,尝试将空闲的android平板作为扩展显示屏

1. 方法

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
  2. 按需获取一个 EDID 文件,注意选取的 EDID 要支持上一步选择的空闲端口的类型
  3. 将获取的 EDID 文件放置在/usr/lib/firmware/edid/目录下(如果没有的话创建)
  4. 编辑/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位置为选择的空闲接口
  5. 执行sudo update-grub更新grub配置,然后重启系统使更改生效
  6. 重启后检查系统设置界面,如果设置中认为连接了一个新的显示器,证明虚拟显示器配置成功
    • 在 Wayland 下,如果不需要使用虚拟显示器可以直接在设置中关闭

1.2 sunshine + moonlight安装与配置

  • 电脑上安装 sunshine,平板上安装 moonlight
    • 对于 sunshine,安装后首次进入 WebUI 时会提示创建账户

sunshine配置

  1. 在 sunshine WebUI Troubleshooting # Logs 中找到KMS Monitor List,从中获取虚拟显示器接口对应的编号,将 sunshine WebUI 中Configuration # Audio/Video # Display number 设置为对应编号
  2. 对Configuration中其他选项按需调整
  3. 保存并应用 sunshine 配置更改
  4. 如果系统使用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-APISoftware可以避免该情况
    • Force a specific Capture Method中,Nvidia + Wayland 下只有KMS选项可用,NvFBC 需要 nvlax patch 支持,其余不行
    • Force a Specific Encoder中,可行的有VA-APISoftwareNVIDIA 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 即可

参考

posted @ 2025-03-28 01:30  Twinblade_i  阅读(2619)  评论(0)    收藏  举报