Moonlight串流分辨率自动匹配:从黑边拉伸到点对点
串流折腾到一定程度,真正让人抓狂的往往不是延迟和掉帧,而是画面边上那两条黑边,或者明明满屏却糊成一片的拉伸感。Moonlight 分辨率自动匹配这件事,说穿了就是把“主机端输出分辨率、编码分辨率、客户端屏幕分辨率”这三个数字对齐,可现实里设备型号五花八门,手机是 20:9、平板是 4:3、电视是 16:9、掌机是 16:10,黑边和拉伸几乎是每个新手必踩的第一道坎。这篇文章不讲虚的,我把整套链路拆开,从原理到参数计算再到脚本联动,把自动匹配这件事讲透,配置动作本身确实三分钟就能做完,剩下的时间都是用来理解“为什么这么配”的。适合已经能连上串流、但画面始终不对劲的朋友,也适合准备入手串流、想一次配到位少走弯路的人。
1. 黑边和拉伸到底从哪来:先把问题拆开看
1.1 一条串流链路里的四个分辨率层级
很多人一上来就调客户端的串流分辨率,调完发现没用,问题就在于没搞清楚这条链路上其实有四个不同层级的“分辨率”在互相打架。第一层是源分辨率,也就是服务端桌面实际输出的尺寸,如果主机接着物理显示器,那就是显示器当前的工作分辨率;如果主机是“无头”状态,那可能是虚拟显示器给的默认值,甚至是 1024x768 这种遗产分辨率。第二层是编码分辨率,服务端抓取画面后交给硬件编码器的尺寸,它未必等于源分辨率,某些配置下会被强制缩放。第三层是播放分辨率,也就是客户端解码后送进渲染窗口的尺寸,Moonlight 的设置项控制的就是这一层。第四层是显示分辨率,即设备屏幕的物理像素,手机、电视、显示器各自不同。
这四层里只要有两层比例不一致,结果必然是黑边或拉伸。比例一致但数值不一致,结果就是缩放模糊。举个最常见的例子:手机屏幕是 2400x1080,比例 20:9,服务端桌面是 1920x1080,比例 16:9。客户端如果不做处理直接铺满,画面就会被横向拉长,人物变胖;如果保持比例,左右就会各留一条黑边。这两种结果都不是设备坏了,而是 20:9 和 16:9 天生对不上。理解这一点,后面的所有操作才有意义——我们要做的是想办法让源分辨率去适配客户端的比例,而不是硬让客户端去迁就主机。
1.2 五种典型错配组合与现象对照
我整理了实际遇到过的几种组合,基本覆盖了新手 90% 的疑惑。对着表看现象,比盲目试参数快得多。
| 源分辨率 | 串流设置 | 客户端屏幕 | 实际现象 | 根因 |
|---|---|---|---|---|
| 1920x1080 | 1920x1080 | 1920x1080 | 完美点对点 | 三层一致 |
| 2560x1440 | 1920x1080 | 1920x1080 | 文字发虚、细节丢失 | 源被降采样 |
| 1920x1080 | 1280x720 | 1920x1080 | 满屏但整体发糊 | 编码不足后放大 |
| 1920x1080 (16:9) | 1920x1080 | 2400x1080 (20:9) | 左右黑边或横向拉伸 | 比例不匹配 |
| 1680x1050 (16:10) | 1920x1080 | 1920x1080 | 上下黑边,画面偏小 | 源比例小于播放比例 |
| 竖屏 1080x1920 | 1920x1080 | 1080x2400 | 上下大片黑边 | 方向未对齐 |
需要特别说明表里第四行。同样是“比例不匹配”,Moonlight 在客户端提供了不同的缩放策略,选“保持比例”就是黑边,选“铺满”就是拉伸,选“裁剪”则是画面被切掉边缘。这三种没有绝对的好坏,取决于你玩的游戏类型,后面第 3 节会详细说选型逻辑。
还有一类隐形问题容易被忽略:电视的过扫描(Overscan)。部分电视默认会把输入画面四周裁掉 2% 到 5%,于是你会看到桌面任务栏被切掉一半,误以为是串流分辨率设错了。这种情况要在电视的图像设置里把“画面比例”改成“点对点”或“仅扫描”,跟串流软件一点关系都没有。
1.3 为什么“自动匹配”经常不自动
Moonlight 确实有自动识别客户端分辨率的能力,但它的判断依据是操作系统上报的屏幕参数,而现实里这个上报经常不准。安卓设备刘海屏、挖孔屏、手势导航条会占用显示区域,系统上报的可用尺寸可能比物理像素小一圈;分屏模式下上报的更是半个屏幕的尺寸。Windows 客户端则受窗口大小和系统缩放影响,你在 150% 缩放的笔记本上开窗口,上报的逻辑分辨率可能是 1280x720,实际物理像素却是 1920x1080。
更麻烦的是服务端。自动匹配的前提是主机端存在一个与客户端完全一致的可用显示模式。手机要 2400x1080,你的主机桌面压根没这个模式,只有 1920x1080 和 2560x1440,那自动匹配就只能退而求其次,挑一个“差不多”的,于是黑边或者缩放就来了。这也是为什么我说,真正的“自动匹配”不是靠软件猜,而是靠我们自己把源端造出对应的显示模式来。理解了这一层,方案选型的思路就清晰了。
2. 分辨率自动匹配的整体设计思路
2.1 目标状态:让缩放只发生一次
聊方案之前先立一个原则:整条链路里,缩放最多只允许发生一次,而且必须保持宽高比。每一次缩放都是一次重采样,重采样就必然带来模糊和锯齿。理想状态是源分辨率等于编码分辨率,编码分辨率等于客户端可显示区域的最佳分辨率,三点对齐,零缩放,这就是所谓的“点对点”。
做不到三点对齐时,退一步的做法是让缩放发生在链路末端,也就是客户端渲染那一步。原因是客户端缩放通常由 GPU 或系统合成器完成,质量比服务端软件缩放要好,而且延迟更低。最糟糕的做法是服务端先缩一次、客户端再缩一次,双重缩放之后画面会糊得非常明显,尤其是小字号文本,几乎没法看。
所以整个设计思路可以浓缩成一句话:能在源端解决的比例问题,就不要留到客户端去兜底。源端改分辨率只需要一条命令或者一个脚本,成本极低,收益却是全链路的清晰度提升。
2.2 三条落地路线的优劣对比
我把实际可选的路线归成三类,各自的适用场景差异很大。
| 路线 | 具体做法 | 优点 | 缺点 | 适用人群 |
|---|---|---|---|---|
| A 客户端定死 | 客户端手动指定分辨率,服务端不动 | 配置最简单,三分钟搞定 | 比例不匹配时必然黑边或拉伸 | 主机固定接显示器、比例能对上的人 |
| B 客户端自适应 | 依赖自动识别 + 保持比例缩放 | 换设备不用重配 | 上报不准时经常翻车,量化模糊 | 设备经常换、能接受轻微黑边的人 |
| C 服务端联动 | 虚拟显示器或脚本,按需切换主机分辨率 | 真正点对点,画质最好 | 需要一次性配置,有一定学习成本 | 追求画质、主机无头或比例特殊的人 |
路线 A 本质上放弃治疗,把问题交给缩放模式去处理,能看但不精致。路线 B 是大多数人的默认状态,也是最容易产生“为什么我的画面有黑边”这类疑问的状态。路线 C 才是标题里说的“终极解决方案”,它的核心思想是:客户端要什么分辨率,服务端就造什么分辨率,让主机端主动去适配客户端,而不是反过来。
路线 C 又有两种实现方式。一种是装虚拟显示器驱动,在没有物理显示器的机器上凭空造出一块任意分辨率、任意刷新率的“假屏幕”,串流采集这块假屏幕的画面。另一种是在有物理显示器的情况下,直接用命令行工具动态切换显示器分辨率,串流开始前切到目标分辨率,串流结束后切回来。前者适合无头主机和服务器,后者适合日常还要用这台机器办公的场景。
2.3 我的选型逻辑:以 C 为主,A 为辅
我自己的主机是一台放在角落的无头机器,平时不开显示器,全靠串流用。这种情况下路线 C 的虚拟显示器方案几乎是唯一解,因为物理输出口上什么都没插,系统会退回到默认的低分辨率,不装虚拟显示器根本谈不上点对点。
但即便有虚拟显示器,我也没有完全放弃手动指定。原因是虚拟显示器驱动能提供的模式是有限的,有时候客户端想要的尺寸恰好在列表里没有,这时候就需要客户端侧退一步,选一个最接近的、并且比例一致的模式。所以最终的做法是:服务端尽量造出精确分辨率,客户端设置里把分辨率固定成同一个值,缩放模式选“保持比例”作为兜底。三层保险叠加上去,即使某一层出了问题,最多也只是留一点点黑边,不会出现拉伸变形。
有一点必须提前说清楚:不管走哪条路线,客户端和服务端的刷新率也要对齐。很多人只盯着分辨率,结果主机输出 60Hz、客户端请求 120fps,采集端跟不上,画面照样会一顿一顿的。刷新率对齐的逻辑和分辨率完全一样,源端给多少,客户端就设多少,不要越级请求。
3. 核心参数逐项拆解:宽高、缩放、显示模式
3.1 分辨率与码率怎么算才不浪费带宽
分辨率定下来之后,紧接着就是码率。码率给低了,高分辨率也白搭,压缩块会把细节全吃掉;码率给高了,网络扛不住,延迟和卡顿就来了。这里有一个基于像素数的经验算法,比死记硬背靠谱。
先算像素总量:1920x1080 约 207 万像素,2560x1440 约 369 万,3840x2160 约 829 万。以 1080p60 需要 15Mbps 为基准,其他分辨率按像素比例线性放大,再按帧率比例修正。
| 目标分辨率 | 像素数(万) | 相对 1080p 倍数 | 60fps 建议码率 | 120fps 建议码率 |
|---|---|---|---|---|
| 1280x720 | 92 | 0.44 | 8 Mbps | 14 Mbps |
| 1920x1080 | 207 | 1.00 | 15-20 Mbps | 28-35 Mbps |
| 2560x1080 | 276 | 1.33 | 20-25 Mbps | 38-45 Mbps |
| 2560x1440 | 369 | 1.78 | 26-35 Mbps | 50-60 Mbps |
| 2400x1080 | 259 | 1.25 | 20-25 Mbps | 36-45 Mbps |
| 3840x2160 | 829 | 4.00 | 50-70 Mbps | 不建议无线 |
算一下实际占用:20Mbps 换算成字节是每秒 2.5MB,一小时大约 9GB。这个数字对本地局域网无所谓,但如果走的是跨网络的远程串流,就要掂量一下流量成本了。我的习惯是在局域网内把码率顶到设备能稳定承受的上限,因为局域网带宽基本不是瓶颈;跨网络时反而会主动降到 1080p60 加 15Mbps,牺牲一点清晰度换稳定。
注意:码率不是越高越好。当码率超过网络实际可用带宽的 70% 左右时,缓冲区会开始堆积,表现为操作延迟慢慢变大,玩动作游戏时特别明显。宁可降一档码率,也不要贴着带宽上限跑。
3.2 保持比例、铺满、裁剪:三种缩放模式怎么选
客户端设置里的缩放选项,本质上是三种不同的取舍,没有绝对的对错。
**保持比例(适应)**会把整个画面完整显示在屏幕内,比例不一致时留黑边。它的好处是绝不丢失任何画面信息,UI 边缘、小地图、血条都在,缺点是浪费了一部分屏幕面积。MOBA、策略、模拟经营这类需要看清边角信息的游戏,我基本都用这个。
**铺满(拉伸)**强行把画面拉到整个屏幕,比例不对时人物会变形。它唯一的优势是视觉上“没有黑边”,沉浸感稍好一点。但变形带来的眩晕感和操作手感偏差是真实存在的,尤其是第一人称射击,准星都被拉扁了。我只有在源比例和屏幕比例差距极小(比如 16:10 对 16:9)的时候才会考虑它。
**裁剪(缩放填充)**按比例放大到铺满屏幕,超出部分被切掉。它既不变形也不留黑边,代价是画面边缘被裁。这个模式适合那些重要信息集中在画面中央的游戏,比如部分动作和竞速类。但要注意,HUD 固定在画面边缘的游戏用这个模式会很难受,血条可能直接被切没了。
3.3 显示模式与 DPI 缩放:模糊的两个隐形杀手
分辨率配对了,画面还是糊,八成是这两个原因之一。
第一个是显示模式。很多游戏默认走“独占全屏”,它会直接接管显示输出,按游戏内部设定的分辨率去切换显示模式。如果游戏内设定和串流分辨率不一致,切换瞬间画面就会变形或者黑屏几秒再恢复。改成“无边框窗口”通常更稳,因为它遵循桌面分辨率,不会触发显示模式切换。代价是无边框窗口会经过桌面合成器,理论上多一点点延迟,实际体感差异很小,我用下来基本感知不到。
第二个是系统 DPI 缩放。Windows 在 4K 屏上默认推荐 150% 缩放,这个缩放会让很多游戏按“逻辑分辨率”而不是物理分辨率渲染,结果就是画面被拉伸得模模糊糊。串流主机上我建议把缩放统一设为 100%,需要大字就靠降低分辨率来实现,而不是靠缩放比例。这一点在无头主机加虚拟显示器的场景下尤其关键,因为虚拟显示器有时候会继承一个奇怪的 DPI 值。
还有一个连带项是HDR。如果客户端屏幕支持 HDR 而服务端没开,或者反过来,画面会明显发灰、对比度发闷。这个不是分辨率问题,但经常和分辨率问题一起出现,让人误判。排查时先把 HDR 关掉,把分辨率问题解决干净,再单独开 HDR 调色调,不要两件事一起动。
4. 手把手实操:把自动匹配真正跑通
4.1 开工前的五分钟检查清单
动手之前先确认几件事,能省掉后面大量的无效排查。
- 服务端和客户端版本尽量保持同一代,跨大版本时协议字段可能对不上,自动匹配行为会变。
- 确认主机是否接着物理显示器。接着的话,优先走动态切分辨率;无头的话,走虚拟显示器。
- 确认客户端屏幕的物理像素和当前可用区域。安卓可以在开发者选项里看,Windows 用下面这段命令看。
- 确认网络是千兆有线或者 5GHz 以上的无线,先把带宽问题排除掉,否则你永远分不清是分辨率配错还是网络不够。
在 Windows 客户端上查当前屏幕和分辨率,用 PowerShell 跑这几行:
Add-Type -AssemblyName System.Windows.Forms [System.Windows.Forms.Screen]::AllScreens | Select-Object DeviceName, Primary, @{n='宽';e={$_.Bounds.Width}}, @{n='高';e={$_.Bounds.Height}}服务端想知道显示器到底支持哪些模式,用这段读 EDID 里的模式列表:
Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorListedSupportedSourceModes | ForEach-Object { $_.MonitorSourceModes | Select-Object ` @{n='宽';e={$_.HorizontalActivePixels}}, @{n='高';e={$_.VerticalActivePixels}}, @{n='刷新率';e={[math]::Round($_.VerticalRefreshRateNumerator / $_.VerticalRefreshRateDenominator)}} } | Sort-Object 宽, 高 -Unique提示:上面第一段命令返回的是逻辑像素,系统缩放不是 100% 时会比物理像素小。判断点对点时以物理像素为准,别被逻辑像素误导。
4.2 客户端侧的四步配置
客户端的配置其实非常简单,四步走完。
第一步,进入设置里的分辨率选项。如果服务端已经能提供精确分辨率,就直接手动选同一个值,别用“自动”。自动识别的准确率在特殊比例设备上并不高,手动指定是确定性的。
第二步,刷新率对齐服务端输出。服务端桌面是 60Hz 就选 60,是 120Hz 就选 120。这里有个反直觉的点:客户端屏幕是 120Hz、服务端只有 60Hz 时,选 60 反而比选 120 更顺,因为选 120 会产生帧节奏不匹配,画面会有轻微的抖动感。
第三步,缩放模式先设“保持比例”。这是最安全的起点,先确认没有拉伸变形,再根据实际黑边情况决定要不要换。
第四步,码率按第 3.1 节的表来填,首次可以保守一点,跑通之后再往上加。
整个客户端配置如果目标明确,三分钟绝对够了。真正花时间的是服务端,因为那里才是分辨率问题的源头。
4.3 服务端侧:让主机愿意“变成”客户端的尺寸
服务端分两种情况。
情况一:主机接着物理显示器。思路是用命令行工具在串流开始前切到目标分辨率,串流结束后切回来。服务端软件的“预处理命令”和“结束命令”就是干这个的,把脚本挂上去即可。显示模式切换可以用系统自带的DisplaySwitch.exe,它支持/internal(仅主屏)、/clone(复制)、/extend(扩展)、/external(仅副屏)四种模式。当主机接了一台显示器、同时装了虚拟显示器时,用复制或扩展模式切换就能改变采集源。
@echo off REM 串流开始前:切到扩展模式,让虚拟显示器成为采集目标 DisplaySwitch.exe /extend timeout /t 2 >nul REM 再用你惯用的分辨率切换命令,把虚拟显示器设为 2400x1080@60@echo off REM 串流结束后:切回仅主屏,恢复日常使用 DisplaySwitch.exe /internal情况二:主机完全无头。这时候必须装虚拟显示器,让系统认为有一块屏存在。装好之后在虚拟显示器的控制面板里手动添加你需要的模式,比如 2400x1080@60、1920x1080@120、2560x1600@60 各来一条。加完之后在系统的显示设置里,把这块虚拟屏设为主显示器,分辨率选目标值。之后每次开机它都会以这个分辨率存在,串流时直接采集,完全不需要动态切换。
虚拟显示器方案的好处是稳定,一次配置长期有效,缺点是你得提前知道你所有客户端的尺寸,把它们都加进模式列表。我的做法是列一张表,把自己常用的三四台设备的分辨率全加进去,需要哪个就在客户端选哪个,服务端永远有对应的模式等着。
4.4 用脚本把切换动作自动化
手动切来切去很烦,真正的“自动匹配”应该是一键甚至零操作。服务端的预处理命令支持传入客户端信息,包括分辨率和帧率,这意味着脚本可以读取这些参数,动态决定切到哪个模式。
一个可行的做法是写一个小脚本,接收客户端请求的分辨率作为参数,调用分辨率切换工具完成切换。伪代码逻辑大致是这样:
param([int]$Width, [int]$Height, [int]$Refresh = 60) # 记录切换前的原始分辨率,供结束时恢复 $orig = Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorListedSupportedSourceModes | Select-Object -First 1 "$($orig.CurrentHorizontalResolution)x$($orig.CurrentVerticalResolution)" | Out-File "$env:TEMP\stream_orig.txt" # 调用你惯用的分辨率切换工具 # 例如:& "C:\tools\setscreen.exe" $Width $Height $Refresh Write-Host "已请求切换到 ${Width}x${Height}@${Refresh}"恢复脚本读取临时文件里的原始值切回去。这套逻辑跑通之后,你在客户端点一下串流,主机自动变成你要的尺寸,退出后自动还原,体验上就是真正的自动匹配了。
注意:脚本里一定要留一个“失败兜底”。如果切换命令因为权限或者驱动问题失败了,不要让主机停在一个奇怪的分辨率上,最好设一个默认值作为 fallback,并且在切换后加两百毫秒等待,让显示模式变更稳定下来再让串流软件开始采集。我最早就是没加等待,导致采集到的第一帧是黑屏,串流画面能看到,但整个会话首帧是黑的。
4.5 怎么验证是不是真的点对点
配完之后必须验证,不能靠“看起来还行”。
最直接的办法是在服务端打开一张 1:1 像素的测试图,或者打开记事本敲一排小字,然后在客户端看这排字的边缘是否锐利。有缩放的话,字的笔画会出现明显的半透明灰边,也就是重采样痕迹。再打开一个纯色背景的高对比画面,比如黑白方格,观察黑白交界处有没有过渡色带,有点对点是没有过渡的。
第二个办法看黑边。真正点对点的情况下,画面四边应该是严丝合缝贴住屏幕边缘的,不该有等宽的黑框。有黑框说明比例或分辨率还差一截,回第 1.2 节的表里对一遍。
第三个办法看游戏内的分辨率设置。很多游戏会自动读取当前显示分辨率,如果你在游戏里看到的分辨率数字和你设的一致,那基本就确认了。要是游戏里显示的是另一个数字,说明游戏自己在做缩放,需要进游戏设置手动改。
5. 常见问题与排查速查表
5.1 六个真实踩过的坑
坑一:配好了分辨率,串流还是黑边。查了半天发现是客户端缩放模式选了“保持比例”,而源分辨率比例和屏幕比例差了一点点。这种时候要么把源分辨率改成和屏幕完全同比例的值,要么接受一条细黑边。我最后选的是前者,把虚拟显示器加了一条精确匹配的模式。
坑二:画面清晰但边缘被切。这是电视过扫描。换到电视的 HDMI 输入源,找到画面比例设置,改成点对点或者关闭过扫描,问题立刻消失。
坑三:鼠标位置和画面不同步。这个现象说明采集分辨率和实际输入坐标系不一致,常见于服务端分辨率在串流过程中被改动了。解决方法是在脚本里加等待,确保显示模式切换完成再启动采集。
坑四:换成高分辨率后疯狂掉帧。大概率是编码器扛不住了。硬件编码器对不同分辨率有性能上限,4K60 在某些卡上就是跑不满。降到 1440p 立刻顺畅,说明瓶颈在编码端不在网络端。
坑五:颜色发灰发白。先关 HDR 看是否恢复。如果关掉就正常,说明是 HDR 端到端没有打通,不是分辨率问题,别在这一节耗时间。
坑六:竖屏设备串流横屏画面。方向没有对齐。客户端要开启“锁定横屏”,服务端不要在串流过程中旋转屏幕,两个动作叠在一起最稳。
5.2 排查速查表
| 现象 | 最可能的原因 | 优先验证动作 |
|---|---|---|
| 左右等宽黑边 | 比例不匹配 + 保持比例 | 对比客户端与服务端比例 |
| 画面横向拉伸 | 缩放模式为铺满 | 改为保持比例确认是否恢复 |
| 满屏但整体模糊 | 编码分辨率低于显示分辨率 | 检查客户端串流分辨率设置 |
| 四边有不均匀黑框 | 电视过扫描 | 关掉电视画面比例增强 |
| 文字有彩色描边 | 色度抽样或双重缩放 | 确认缩放只发生一次 |
| 画面清晰但操作延迟大 | 码率贴近带宽上限 | 降一档码率复测 |
| 串流中画面突然变形 | 源端分辨率被改动 | 检查脚本与游戏内设置 |
| 首帧黑屏后恢复 | 显示模式切换未完成 | 在切换后加等待 |
5.3 三条不看文档学不到的经验
第一条,先把分辨率搞定,再谈码率和帧率。顺序错了会浪费大量时间。分辨率不对时,你根本判断不了画质问题到底来自压缩还是来自缩放。
第二条,同一时间只改一个变量。我见过太多人一次性把分辨率、码率、帧率、HDR 全调了,结果画面变差了也不知道是哪个引起的。改一项,测一次,记录下来,这个习惯能省掉几小时的盲目试错。
第三条,留一套能快速回滚的配置。我的服务端上一直存着两份配置:一份是保守的 1080p60,一份是激进的点对点高码率。任何时候新配置出问题,一条命令切回保守配置,先能玩,再慢慢调。这个习惯来自一次把主显示器切到虚拟屏之后忘了切回来,远程桌面直接黑屏的教训,那天晚上花了一个多小时才恢复。
6. 不同设备的推荐配置组合
6.1 手机横屏:比例是最大的敌人
手机是分辨率匹配难度最高的设备,因为比例太杂。20:9、21:9、19.5:9 各种都有,而主流桌面分辨率只有 16:9 和 16:10。
我的建议是:不要试图让服务端去适配那个奇怪的比例,而是让手机在串流时接受上下或左右的窄黑边,把源分辨率设成标准 16:9。原因有两个,一是绝大多数游戏的 UI 是按 16:9 设计的,强行拉宽反而会把 UI 挤变形;二是虚拟显示器加一条 2400x1080 的模式成本很低,但每换一台手机就要加一次,维护成本太高。
如果确实想全屏,那就得二选一:要么接受裁剪,让画面填满但边缘被切;要么在游戏内把视野调节到适配宽屏,然后再用铺满模式。后者体验最好,但不是所有游戏都支持。
码率方面,手机屏幕小,1080p60 加 15 到 20Mbps 已经完全够看,没必要上 1440p,肉眼在小屏上分辨不出来,纯属浪费带宽和解码性能。
6.2 平板与电视盒子:注意解码能力和刷新率
平板常见 4:3 和 16:10 两种比例,电视盒子基本是 16:9。这两类设备的共同点是屏幕大、离得远,所以对分辨率敏感度高,对延迟的容忍度也稍高一些。
平板跑 4:3 比例串流是最尴尬的,16:9 的画面显示在 4:3 屏幕上,要么上下留大片黑边,要么左右被裁掉一大块。我的做法是平板只在玩策略、卡牌这类不依赖画面边缘的游戏时用,分辨率设成 16:10 然后接受上下黑边。真要全屏,就用裁剪模式,但一定要先在游戏里把 UI 元素往中间调。
电视盒子要特别注意解码能力。很多盒子的硬件解码器不支持 4K60 的 HEVC,表面上看能播,实际是软解,CPU 占用拉满,画面卡成幻灯片。判断方法是串流时看盒子的温度或者掉帧情况,如果分辨率一提高就卡,先降到 1080p 验证,确认是解码瓶颈就别硬上。另外盒子的 HDMI 输出刷新率要和服务端对齐,很多盒子默认 60Hz,服务端却跑在 120Hz,这种不匹配会产生规律性的画面跳动。
6.3 掌机与超宽屏:两个极端场景
掌机屏幕小、比例特殊(常见 16:9 和 16:10),但胜在便携。这类设备我推荐固定一套配置:1280x800 或 1920x1080,60fps,码率 15Mbps,缩放用保持比例。掌机的屏幕尺寸决定了它不需要高分辨率,把码率省下来给稳定性更划算。而且掌机通常走无线,带宽波动大,码率留足余量能明显减少卡顿。
超宽屏(21:9、32:9)是另一个极端。这类设备如果服务端不能提供同等比例的分辨率,左右黑边会非常夸张。正确的做法是在服务端加一条 2560x1080 或者 3440x1440 的虚拟显示模式,让源分辨率本身就是超宽的。很多游戏原生支持超宽比例,这种时候体验非常好;不支持的游戏会在左右出现黑柱,那就只能接受,或者改成 16:9 加黑边。
还有一点容易被忽略:超宽屏的像素数很大,2560x1080 虽然高度只有 1080,横向像素多,码率需求比标准 1080p 高不少。按第 3.1 节的表,20 到 25Mbps 是起步价,低于这个数就能看到明显的暗部色块。
最后分享一个我自己的配置习惯:我给每台常用设备都在服务端存了一份预设,文件名就用设备的尺寸命名,比如“2400x1080-60”“1920x1080-120”。串流前不需要思考,选预设、点连接,两秒钟的事。这套东西配下来第一次花了一个多小时,之后每次换设备都是零成本,比起每次临场调参数、调完还不知道对不对,这点前期投入实在太值了。真要说有什么心得,那就是把分辨率当成一个“工程问题”而不是“玄学问题”来对待——它本质上就是几个数字的比例关系,把这几个数字算清楚,黑边和拉伸就再也不会找上门。