ChrisKim
Do not go gentle into that good night.
颢天

Sunshine + Moonlight 熄屏串流方式

由于之前有段时间不在家,只带了笔记本但又想用家里的台式机打游戏,同时有些 Gal Game 也想在手机上玩而不是坐在电脑前玩,因此研究了下串流的方式。在实践中,发现这上面还是有很多坑点的,于是想写一篇文章分享我的经验。

方案与问题

Sunshine + Moonlight 的方案大家应该比较熟悉了,基本上搜串流都会介绍这一方案,因此不多赘述。GitHub 仓库链接如下:

但对于串流来说,它的原理是捕获显示屏的画面压缩为视频流,其前提就是要有显示屏给它捕获画面。因此对于笔记本,进行串流时不可合盖;对于台式机,串流时必须保证显示屏开启,如果显示屏休眠或者关机了那就串流不上了。

这是一个令人头疼的问题,本篇教程便是解决这个问题的。

购买显示欺骗器

前面提到过串流必须接显示器,如果没有显示器的话显卡不输出画面,程序就没有画面可捕获。但是,显卡并不知道显示器是不是真的,因此我们完全可以接个假的显示器来骗显卡输出画面,这样程序就能捕获到了。

HDMI 欺骗器在网上很好买到,20 就能买一个,非常便宜。买个 4K 的欺骗器,一般可以选择最低到最高的所有主流分辨率和刷新率,可以自己在显示设置里调整。

https://assets.zouht.com/img/blog/3674-01.webp

一般情况

对于仅使用独显输出的台式机,或者开启独显直通(屏蔽核显)的笔记本,这属于一般情况,使用最方便。首先将欺骗器插入 HDMI 接口,可以发现系统已经识别到了新的显示器。

为了防止这个虚拟显示器影响我们正常使用(例如窗口飞到虚拟显示器里找不到了),建议大家跟我一起调整下配置。桌面右键选择显示设置,将模式选择为仅在真显示器上显示

https://assets.zouht.com/img/blog/3674-02.webp

这样就完成了配置。此时开盖显示一切正常,假显示器也不会干扰使用,也可以正常串流画面;合盖后真显示器断连,系统自动切入假显示器,串流就会自动切换到假显示器的画面上。

(如果选择“复制这些显示器”,合盖后串流无法自动切换,得手动断开再连接才能继续串流)

如果你有多显示器,那么需要合盖后将多余显示器也断开,让画面仅输出到假显示器上供串流。

特殊情况

对于没有开启独显直通的笔记本,这种属于特殊情况,需要额外配置。

如果笔记本没有开启独显直通,对于笔记本内置显示器,信号路线为 独显 → 核显 → 屏幕,屏幕是接在核显上的;而对于接在笔记本显示接口的外置显示器,信号路线为 独显 → 屏幕,屏幕是接在独显上的

因此,如果使用欺骗器后,相当于真屏幕接在核显上,假屏幕接在独显上,两个屏幕工作在不同显卡上!由于 Sunshine 在这种情况下它会自动选择核显,这就导致你合盖后它在核显上找屏幕,发现找不到屏幕,串流失败。因此我们得手动给 Sunshine 选择显卡,让它捕获独显上的假显示器。

首先插上诱骗器:

https://assets.zouht.com/img/blog/3674-03.webp

然后在设置中将模式选择为“扩展这些显示器”,因为等会我们要用工具查询显示器,得用这个模式才能启用所有显示器。

然后我们找到 Sunshine 的安装目录下的 tools\dxgi-info.exe 工具,默认在 C:\Program Files\Sunshine\tools\dxgi-info.exe,启动一个终端(Win + R 输入 cmd).

然后运行以下指令(带引号):"C:\Program Files\Sunshine\tools\dxgi-info.exe"

例如我的设备会得到以下输出:

====== ADAPTER =====
Device Name      : Intel(R) UHD Graphics 630
Device Vendor ID : 0x00008086
Device Device ID : 0x00003E9B
Device Video Mem : 128 MiB
Device Sys Mem   : 0 MiB
Share Sys Mem    : 16319 MiB

    ====== OUTPUT ======
    Output Name       : \\.\DISPLAY1
    AttachedToDesktop : yes
    Resolution        : 1920x1080

====== ADAPTER =====
Device Name      : NVIDIA GeForce GTX 1650
Device Vendor ID : 0x000010DE
Device Device ID : 0x00001F91
Device Video Mem : 3935 MiB
Device Sys Mem   : 0 MiB
Share Sys Mem    : 16319 MiB

    ====== OUTPUT ======
    Output Name       : \\.\DISPLAY4
    AttachedToDesktop : yes
    Resolution        : 1920x1080

====== ADAPTER =====
Device Name      : Microsoft Basic Render Driver
Device Vendor ID : 0x00001414
Device Device ID : 0x0000008C
Device Video Mem : 0 MiB
Device Sys Mem   : 0 MiB
Share Sys Mem    : 16319 MiB

    ====== OUTPUT ======

注意到我们有 3 个 ADAPTER (显卡),有 2 个 OUTPUT (显示屏)

  • Intel(R) UHD Graphics 630: 核显
    • \\.\DISPLAY1: 内置显示器也就是笔记本显示屏
  • NVIDIA GeForce GTX 1650: 独显
    • \\.\DISPLAY4: 外置显示器也就是我们插的欺骗器
  • Microsoft Basic Render Driver: 这个是没驱动的时候的显示设备,不用管它。

需要记下的是我们的独显设备名称欺骗器名称,然后我们就可以把显示模式改回仅在真显示器上显示了。

然后进入 Sunshine WebUI 进行配置,进入 Configuration 菜单,选择 Audio/Video 选项卡,在 Adapter Name 中填写我们的独显设备名称,在 Output Name 中填写我们的欺骗器名称。例如我需要这样填:

https://assets.zouht.com/img/blog/3674-04.webp

填写好后点击 Save 并 Apply 即可。

此时,我们会发现开屏时连不上串流了,这是正常现象,因为我们已经强制指定 Sunshine 捕获欺骗器上的画面,开屏时欺骗器上没有画面因此捕获不到。不过我们合上笔记本盖子后,内置显示器断连,此时欺骗器有画面,再连接串流就能正常显示了。


但是坑爹的是,我发现事实并不会这样,Sunshine 还是连不上(目前为 0.21.0 版本)

经过测试后我发现一个问题,Sunshine 在显示器切换后不会自动刷新编码器。如果我们在开盖时启动 Sunshine,它启动后检测发现找不到 \\.\DISPLAY4 (因此此时我们选择仅在内置显示器上显示),于是就停止工作了,即使合上盖子后 \\.\DISPLAY4 正常出现它也不会刷新。

为了解决 Sunshine 的这个问题,我们需要 Sunshine 在合盖时启动,这样它就能启动后检测到 \\.\DISPLAY4 了。要实现这个操作,我们可以先启动 Sunshine 后立即合上盖子,或者是点击重启 Sunshine 后立即合上盖子,保证它启动时诱骗器 \\.\DISPLAY4 已经激活。

个人认为这应该是个 bug,我已经向 Sunshine 提交 issue,不知道会不会修复:https://github.com/LizardByte/Sunshine/issues/2078#issuecomment-1919548775

本文链接:https://www.zouht.com/3674.html
本文使用:CC BY-NC-SA 4.0 许可
# # # # #
首页      教程      Sunshine + Moonlight 熄屏串流方式

发表回复

textsms
account_circle
email

颢天

Sunshine + Moonlight 熄屏串流方式
由于之前有段时间不在家,只带了笔记本但又想用家里的台式机打游戏,同时有些 Gal Game 也想在手机上玩而不是坐在电脑前玩,因此研究了下串流的方式。在实践中,发现这上面还是有很多坑点…
扫描二维码继续阅读
2024-02-01