1. 黑边问题的真相先说清楚串流时你看到的黑边到底哪来的我最早被移动端串流黑边折磨是在用平板躺床上打PC游戏的时候。当时屏幕上下两条大黑边画面被强制压成一条窄带游戏里的字都看不清那体验基本等于劝退。后来陆续试过不少串流方案把黑边问题来回折腾过好几遍也算把这里面的原理摸清楚了。先给结论串流黑边的本质不是你的网络不行也不是串流软件坏了而是客户端设备的屏幕比例和服务端渲染出来的画面比例对不上。这里要稍微讲一下串流的工作流程理解了流程黑边的问题就很好定位了。整个串流链路是这样的PC端启动游戏显卡按某个分辨率渲染画面比如PC显示器是2560×1440游戏就按这个分辨率跑。串流服务端比如Sunshine、NVIDIA GameStream、Steam Link抓取渲染好的画面按设定的码率和帧率编码成视频流。视频流通过网络推送到移动设备。移动端的串流客户端App接收视频流解码然后以全屏方式显示在屏幕上。关键问题出在第2步和第4步之间。PC端抓取的画面比例通常是16:9或者PC显示器的原生比例超宽屏常见的21:9更麻烦而移动设备屏幕比例五花八门——iPad是4:3或3:2安卓平板常见16:10手机一般是19.5:9或20:9折叠屏甚至能到接近1:1。当服务端把16:9的画面塞到一个20:9的屏幕里时客户端App就需要做个抉择要么将画面等比缩放画面左右两边留出黑边要么将画面拉伸铺满虽然没黑边但所有物体都变形看着更难受要么裁切掉画面上下部分强行填满屏幕但这样就丢失视野了。绝大多数串流客户端默认选择第一种——等比缩放保黑边因为这样至少游戏画面是正常的。所以黑边本质上不是Bug反而是一种不出错的默认行为。我们要做的是告诉串流两端别按原来的比例干活了按我屏幕的比例来。顺带说一下很多人在串流时遇到画面模糊字体发虚黑边反而是小问题。模糊多数是码率不足或分辨率没匹配这个后文也会涉及。但今天的主角是黑边我们把黑边彻底干掉。串流方案选型上我个人强烈建议现在折腾就用Sunshine Moonlight这个组合。NVIDIA GameStream 已经官宣停止支持Steam Link 虽然简单但自定义能力太差Resolume Arena 那些另类方案就更不用提了。Sunshine服务端 Moonlight客户端是目前开源生态里最活跃、自定义程度最高、跨平台覆盖最全的方案本文的一键串流和手动操作方案都以这个组合为主部分辅助提一下Steam Link。2. 一键串流普通用户优先走的路推荐的两套玩法一键串流的核心思路就是让工具自动协调PC端渲染比例和移动端屏幕比例不需要你手动去算分辨率。这里我推荐两条路子一条是PC端装辅助工具一条是直接用更智能的虚拟显示器方案。2.1 方案ASunshine自带的分辨率切换脚本推荐小白直接抄Sunshine是开源串流服务端它有个很实用的能力可以在串流会话开始和结束时自动运行你指定的脚本。利用这个能力配合一个第三方小工具就能实现连接时自动把PC分辨率改成移动端比例断开时自动改回。这里要用到的小工具叫QRes或者ChangeResolution它们的作用是通过命令行修改Windows分辨率。我自己用的是 ChangeResolution因为它的参数更直观支持直接指定分辨率和刷新率。具体搭建流程如下先安装Sunshine安装完打开Web管理界面默认端口是47990浏览器访问http://localhost:47990。下载ChangeResolution.exe放到一个固定目录比如C:\Tools\ChangeResolution.exe。在Sunshine的Web管理界面里找到Configuration → Do Cmd配置项。Sunshine提供两个配置do_cmd: 串流会话开始前执行的命令。do_cmd_undo: 串流会话结束后执行的命令。在do_cmd里填入C:\Tools\ChangeResolution.exe /w1920 /h1200这里的分辨率用你的移动设备屏幕比例反推出来。后面第4章会详细讲怎么算先直接用。在do_cmd_undo里填C:\Tools\ChangeResolution.exe /w2560 /h1440这里填你PC显示器原本的分辨率。保存配置重启Sunshine服务生效。之后你从手机或平板发起串流Sunshine会在连接建立时先把PC分辨率改成移动端对应的分辨率游戏画面就不会再出现黑边。这个方案的好处是对PC端正在运行的游戏基本无感因为大多数游戏在串流时都是独占全屏或窗口化全屏系统分辨率变了游戏渲染分辨率也跟着变个别不支持的需要在游戏里也手动改后面手动章节会讲。2.2 方案B用虚拟显示器绕开物理显示器束缚方案A有个潜在的坑如果你PC本来就没插显示器比如主机放角落只当串流服务器用分辨率切换可能会失灵甚至没有物理显示器默认分辨率这个概念系统会以显卡输出的默认值工作容易出幺蛾子。更稳的路子是做一个虚拟显示器。虚拟显示器的原理是在驱动层面凭空模拟出一个真实显示器设备给显卡它不占用物理HDMI/DP口但Windows会认为确实有一个显示器连着于是你可以给它设置任意分辨率、任意刷新率。而且现在串流圈最常用的虚拟显示器驱动已经能做到不插物理显示器也能输出画面彻底屏蔽物理显示器的影响。比较主流的两个方案Virtual Display DriverIDDIndirect Display Driver。这是目前串流社区最活跃的开源项目。安装完成后Windows会多出一个虚拟显示器你可以在显示设置里把它设为副屏或主屏给它设定移动端对应的分辨率。关键是可以做到分辨率自动适配比如安卓手机是16:10就把它设成1920×1200iPad是4:3就设成1600×1200。然后串流的时候Sunshine直接从虚拟显示器抓画面虚拟显示器是不存在物理黑边的黑边问题直接从源头解决。老牌的VirtualHere附带虚拟显示器功能但它是USB/IP方案主要用于共享USB设备串流无头PC时顺带用一下不如IDD干净。用虚拟显示器之后配合Sunshine的分辨率脚本可以实现更丝滑的体验连接时把虚拟显示器切成移动端的原生分辨率断开时切回默认全程不需要动物理显示器。如果你是无头主机headless用户虚拟显示器基本上是必备的没有它很多串流场景都会出怪问题。我个人的建议如果你只是偶尔串流用方案A就够了如果你经常串流甚至PC是常开无头状态直接上方案B一劳永逸。2.3 动手前先看清楚你的手机/平板屏幕比例到底是多少一键串流虽然一键但填入脚本的分辨率还是要算的。这一步没做对后面全是白搭。屏幕比例的算法很简单用分辨率的最简整数比。你可以查设备参数也可以直接算以1920×1080为例1920:1080除以120得到16:9。以2560×1600为例2560:1600除以160得到16:10。iPad的分辨率是2048×1536除以512得到4:3。手机常见的2340×1080除以60得到19.5:9。然后你要做的是反推我的PC端串流分辨率应该设成多少原则很简单——只要画面比例和屏幕比例一致就不会有黑边。举例手机是19.5:92340×1080那PC端分辨率可以设成 2340×1080前提是你的显卡和串流链路支持这种非标准化分辨率。如果不支持就退而求其次选标准分辨率里比例最接近的比如2560×108021:9虽然严格说比例不完全一样但黑边会极小肉眼几乎不可见。平板是16:102560×1600PC端直接设成 2560×1600 或 1920×1200。iPad是4:32048×1536PC端设成 1920×1440 或 1600×1200这些是标准的4:3分辨率兼容性最好。搞清楚这个逻辑你在选择填什么分辨率时就不会一脸懵。很多人问为什么我填了1920×1200还是黑边多半是因为他手机其实是20:91920×1200是16:10比例对不上不黑才怪。3. 手动操作说清楚每一项设置的意义而不是让你照着点一键方案覆盖了大部分场景但有的游戏特殊、有的设备特殊、有的串流组合特殊你就得手动进设置里调。手动操作不丢人反而能让你真正理解黑边是怎么没的。我把手动操作拆解成三个环节服务端设置、客户端设置、游戏内设置。3.1 服务端Sunshine的显示准备和抓屏区域配置先说Sunshine端的关键设置很多人不知道它的意义只求能连上就行结果黑边问题永远解决不了。在Sunshine Web管理界面的Configuration页面里有几个选项Resolution这个字段指定串流时的分辨率。这个值很关键它决定Moonlight客户端收到的视频流分辨率。如果你把Resolution设成1920x1200那视频流就是1920×1200即使PC物理显示器的分辨率不是这个。FPS帧率按你的网络和硬件能力设一般60就够高刷屏可以设到90或120。Bitrate码率建议有线网络设到30-50 Mbps无线网络根据信号强度调整码率太低会导致画面模糊、色块码率太高会导致延迟和卡顿不会直接导致黑边。在Resolution这里Sunshine有个匹配客户端的逻辑如果你在客户端选择了自动Sunshine会根据客户端的屏幕情况尝试协商一个合适的分辨率。但实测下来不同版本、不同设备组合下自动协商效果参差不齐苹果设备有时候会绕开你说的比例直接按屏幕物理分辨率发请求。所以我更建议把Sunshine的Resolution固定成你移动端屏幕比例对应的分辨率让客户端也固定成同样的分辨率两边统一别依赖协商黑边的概率会降到最低。这里也提一下抓屏区域display capture region。Sunshine默认是抓整个桌面如果有多个显示器可以指定抓哪个。如果你的PC主屏是超宽屏副屏是虚拟显示器而你串流时想抓副屏可以在Configuration → Display Output里选择具体显示器或通过脚本切换主副屏。实战中主屏16:9、虚拟屏16:10的组合很常见串流前把主显示器切换成虚拟屏串流结束再切回来这一套是可以写成脚本的配到do_cmd里。3.2 客户端Moonlight的分辨率设置与画面缩放方式客户端这边Moonlight的连接界面有一个引脚PIN配对流程之后每次连接前进入设置 → 视频选项你会看到分辨率提供自动原生自定义几个档位。帧率60/90/120。码率可以拖动滑块。流畅度优先/画质优先这个会影响编码参数但对黑边没直接影响。要消除黑边分辨率这一项建议选自定义手动填入和Sunshine端一致的分辨率。选自动不是不行但我实测某些设备上自动会把分辨率匹配到物理屏幕的原始像素比如iPad的原始物理分辨率是2048×1536但串流服务端不支持这么高的分辨率时会退回16:9黑边就又冒出来了。还有个容易被忽略的点Moonlight的显示缩放设置。进入串流会话后可以在屏幕上三指轻点或者从屏幕顶部下滑呼出菜单打开Moonlight的控制栏里面有个画面缩放或拉伸选项。默认是等比缩放如果你手动强行把它改成拉伸铺满黑边会消失但画面会被横向/纵向拉长所有物体比例变形。这个我强烈不建议用宁可保留小窄边也不要拉伸拉伸玩游戏看地图、看人物都歪。3.3 游戏内分辨率设置导致的隐藏黑边案例服务端和客户端都对齐了有些游戏还是有黑边问题出在游戏自己身上。最常见的场景是PC连接了物理显示器分辨率脚本也生效了但游戏本身的渲染分辨率没有跟着系统分辨率变。尤其是一些老游戏、或者默认锁定16:9的竞技游戏你系统分辨率是1920×1200游戏启动后还是用1920×1080渲染游戏窗口上下就会留黑边。解决办法进游戏设置把分辨率改成和系统一致的1920×1200如果游戏不支持16:10比例那就只能以16:9为标准分辨率串流接受小左右黑边或者通过修改配置文件强开比例有些游戏可以用 ini 或 cfg 强制分辨率。还有一种隐藏黑边是游戏内的画面上有装饰性边框很多日式RPG为了看电影化表现会在画面上下加黑条那个是游戏美术设计的一部分去掉方法因游戏而异多数情况需要打画质Mod这不属于串流黑边的范畴就不展开说了。4. 高端局多设备共存、超宽屏、折叠屏的场景化配置当你只有一个手机一个PC的时候黑边问题很简单。一旦设备多了一劳永逸的神话就破灭了。我家里有手机、iPad、安卓平板、SteamDeck、Switch需要串流到PC当副屏玩模拟器还把PC接到了客厅电视上这一堆设备串流同一个PC黑边问题的复杂程度会瞬间上升。4.1 不同比例设备共用一台PC用per-device配置实现无缝切换Sunshine有一个非常实用的能力就是针对不同客户端设备分别设置不同的do_cmd脚本。它的原理是Sunshine在建立会话时会读取客户端的名称Moonlight里的主机名称或者设备的标识然后在Web管理界面里你可以给每个设备单独配置会话参数。实际操作路径把手机、iPad、SteamDeck分别配对好Sunshine的Clients页面会列出每个客户端。在Configuration → Advanced里找到per-device do_cmd类似选项不同版本位置略有区别或者通过Advanced → Options里的自定义配置给每个设备写不同的do_cmd。比如iPad设备4:3屏幕do_cmd里切换分辨率到 1920×1440安卓平板16:10do_cmd里切换分辨率到 1920×1200手机19.5:9do_cmd里切换分辨率到 2160×1080SteamDeck16:10do_cmd里到 1280×800。配好之后每次从哪个设备发起串流Sunshine就自动切到对应分辨率断开再自动恢复。这个体验非常丝滑不用每次手动改。前提是你设备的名称在Moonlight里能区分开建议配对时就把每个客户端的名字改成iPhone15Pro、iPadPro11这种一眼能认出来的。4.2 超宽屏显示器用户比例协商失灵时的兜底办法如果你是21:9超宽屏如3440×1440用户串流到手机上黑边问题会更恶心。因为3440×1440的比例是21.4:9不管你的手机是19.5:9还是20:9都跟它不匹配。这里有几条路老老实实按移动端比例走。串流时把虚拟显示器切到移动端的比例游戏也专门给它设置一个适合的窗口分辨率。超宽屏玩游戏时感受21:9的视野串流看手机时牺牲一点视野换无黑边这是大多数人的选择。保留黑边接受电影院模式。很多串流客户端App本身就支持背景填充Moonlight在拉伸模式下有将黑边替换为背景色的选项把黑边换成深灰色或自定义颜色视觉上比纯黑舒服一点但不是根治。只串流游戏画面到一个固定窗口区域。有些游戏支持无边框窗口化你可以用Sunshine的抓屏区域功能只抓游戏窗口所在的区域这样视频流就是游戏窗口本身的宽高比跟移动端比例匹配度更高。超宽屏场景下我个人的建议是直接把PC的串流分辨率做成一套独立的虚拟显示器配置物理显示器怎么折腾是你坐PC前的事串流走另一套逻辑。反正虚拟显示器不用花钱多建几个不同比例的都行。4.3 折叠屏、掌机、Switch串流的特殊处理折叠屏是最麻烦的因为折叠状态下和展开状态下屏幕比例完全不同。比如某折叠屏展开是接近1:1的方形折叠后是21:9。你在Moonlight里设置固定分辨率折叠屏合上屏之后比例又变了黑边又来了。对于折叠屏目前最省心的方案用一个不常见但能通用的中间比例比如展开时用2160×21601:1折叠时手动切回2160×108018:9。这个没法完全自动化只能做到折叠屏折叠时用A配置文件展开时用B配置文件。有些折叠屏手机支持外屏预览配合第三方工具可以做到根据传感器状态自动切换但折腾成本高如果只是玩游戏手动切换也够用。Switch串流PC的情况更特殊。Switch本身是1280×72016:9的屏幕虽然硬件能解码串流画面但很多串流客户端App在Switch上运行效果参差不齐画面比例通常以Switch屏幕的16:9为标准。你从PC串流到SwitchPC端设16:9的1080p或720p就没问题。要让Switch串流出来画面没有黑边Sunshine端分辨率设成1920×1080或1280×720就好别设成16:10。这也是很多人刚接触Switch串流时容易踩的坑——它在平板或手机上能用在Switch上就黑边其实就是Switch屏幕16:9锁定导致的。另外从那些串流热搜词里可以看到很多人搜pavlov用steam串流看不到图像和switch串流pc教程。这两个问题其实都和分辨率/黑边有一定关联pavlov串流看不到图像往往不是黑边问题而是独占全屏游戏在串流时未能正确捕获画面某些游戏在独占全屏状态下Sunshine抓不到帧。解决办法是把游戏改成无边框窗口化或窗口化全屏这样串流抓屏的成功率会高很多。这和黑边有点关系因为窗口化之后游戏窗口可能不是全屏产生新的黑边所以需要把窗口分辨率设成和虚拟显示器一致。Switch串流PC教程里常提到的画面偏黑/黑边多半是分辨率协商和HDCP高带宽数字内容保护的问题Switch的视频输出如果走底座模式有些采集方式会被HDCP锁住画面全黑。这不是严格意义上的黑边但排查链路类似都属于画面显示不正常范畴需要检查采集设备和分辨率设置。5. 实战排查链路一个奇怪的黑边案例从现象到根因的完整复盘前面讲的都是理论加常规配置这一节我想完整还原一次我实际遇到的黑边排查过程。当时的情况是安卓平板16:10串流PC一键方案跑通大多数游戏正常但有一款格斗游戏死活有黑边而且是左右都有大黑边上下反而没有。5.1 现象描述和初步判断现象游戏画面居中左右两边全是黑边比例明显是4:3的图像嵌在16:10的屏幕里。我第一反应是Sunshine的do_cmd脚本没生效但已经连续两次确认脚本执行成功系统分辨率也切到了1920×1200。于是又怀疑Moonlight端是不是没按自定义分辨率走但Moonlight里明明选的1920×1200。那问题大概率出在游戏本身。进游戏设置一看果然游戏只提供4:3和16:9两种窗口模式没有16:10它强制用1280×9604:3渲染。这个场景其实很典型。很多移植自街机或主机的格斗游戏原生比例就是4:3开发商懒得做16:10适配系统分辨率即使变成16:10游戏内部渲染还是4:3而且它用居中左右裁黑的方式适配宽屏导致左右黑边。5.2 排查过程和修复方案排查链路是这样的确认系统层无黑边先断开串流直接在PC端把系统分辨率改成1920×1200打开游戏看桌面任务栏。如果系统层正常、桌面没有黑边说明分辨率切换本身没问题。确认Moonlight视频流层无黑边把Moonlight的分辨率固定为1920×1200后连接串流不打开游戏只看Steam大屏幕或桌面背景。如果桌面背景填满了屏幕没有黑边说明串流链路正常。确认游戏层是唯一变量打开游戏发现左右黑边回来。基本锁定是游戏渲染比例问题。查找游戏是否支持自定义分辨率在游戏设置里搜索分辨率选项找不到16:10。查了一圈社区发现这个游戏在配置文件里可以强行写入自定义分辨率。修改游戏配置文件在游戏的ini或cfg文件里把分辨率值强制改成1920×1200并设置渲染模式为拉伸或窗口化。改完后启动游戏画面填满整个串流窗口黑边消失。当然游戏里的人物因为拉伸比例会稍微变扁一点点但格斗游戏里的判定框还是按水平拉伸后的像素算实际影响很小完全可以接受。5.3 黑边排查速查表经过几次折腾我把黑边排查整理成了一张速查表遇到黑边问题直接按顺序过一遍基本能定位90%的问题。排查项判断方法修复方式系统分辨率脚本未生效串流时看PC桌面是否变成目标分辨率检查do_cmd路径和Sunshine配置重启服务Moonlight分辨率不对串流时看视频流分辨率信息Moonlight控制栏可看手动把Moonlight分辨率设为与Sunshine一致游戏内部强制比例进游戏设置看有无目标比例样式改游戏配置文件强开自定义分辨率客户端App横向/纵向锁定设备横放/竖放时黑边位置变化在App内锁定横屏或竖屏再串流超宽屏物理显示器干扰串流画面比例和虚拟显示器显示不一致换虚拟显示器抓屏或切换主屏游戏窗口模式问题独占全屏或窗口化导致黑边改成无边框窗口化配合虚拟显示器分辨率这张表我每次换新设备、新游戏时都会拿出来过一遍效率高很多。5.4 一个隐藏很深的问题刷新率不匹配也会造成伪黑边最后提一个很少人知道、但实战中很坑的案例刷新率不匹配导致的伪黑边。现象是串流画面能铺满整个屏幕完全没有黑边但画面有轻微的水平撕裂感快速转头时感觉画面抖了一下部分区域像抽动。这不是黑边但如果你把注意力放在屏幕边框附近会误以为画面边缘有杂色或暗角以为是黑边没清干净。根因是刷新率协商失败。比如PC端Sunshine设置了120帧串流但Moonlight端设置的屏幕刷新率是60Hz两边的帧率节奏对不上视频流在某些设备上就会出现垂直同步错位表现就是撕裂和边缘异样。修复方式保证服务端FPS和客户端设置的帧率一致比如两边都是60或都是120。如果移动端屏幕是120Hz高刷但串流只开到60也可以把Moonlight的帧率调到和屏幕一致。网络拉胯导致实际帧率远低于设置值时优先降低FPS档位别硬顶120否则会出现画面卡顿和边缘异常。这个和黑边的处理逻辑是一样的让两端的显示参数完全对齐。6. 最后的工具箱把黑边问题彻底从排查清单里划掉黑边问题看着小但在串流体验里是第一眼感知级别的差异。花十分钟配好分辨率跟忍受半年黑边是完全不同的体验。基于我自己的折腾经历最后把常用的工具和习惯整理一下方便你直接抄。服务端工具链工具用途说明Sunshine串流服务端开源支持do_cmd脚本、多客户端配置ChangeResolution命令行改分辨率配合do_cmd实现一键切换Virtual Display Driver虚拟显示器驱动解决无头PC和分辨率不匹配的根治手段QRes命令行改分辨率备选轻量但参数没ChangeResolution直观客户端设置习惯Moonlight里关闭自动分辨率选项每次固定手动设置和Sunshine端对齐。串流前确认一下设备是横屏还是竖屏竖屏串流PC桌面时黑边巨大是正常的串流游戏请锁横屏。用Steam Link的有黑边时先去设置里看分辨率和缩放选项Steam Link的自动缩放偶尔不靠谱手动指定反而稳定。个人经验总结虚拟显示器是串流黑边的终极答案。预算时间充裕的直接上之前所有的分辨率协调剧本都可以大幅简化。别迷信自动协商。Sunshine和Moonlight的自动协商在大多数标准设备上是好用的但遇到非标准比例、折叠屏、超宽屏、掌机时自动协商经常翻车。手动锁定分辨率虽然每次配置麻烦一点点但出问题的概率小一个数量级。改了分辨率之后一定要验证两端都生效别只看一边。利用Moonlight控制栏里的会话信息看实际视频流分辨率比什么都靠谱。串流画质优先还是流畅优先取决于你用Wi-Fi还是有线。Wi-Fi 5G信号差时码率过高的症状不是黑边而是花屏、卡顿、延迟飙升这类问题请先检查网络再查分辨率。如果你用平板串流PC玩游戏频率很高强烈建议配一个蓝牙手柄加一个支架把平板当便携显示器用。黑边问题解决后这套方案基本能替代一部分背着笔记本出门的场景。黑边这东西本质上就是显示参数没对齐的教科书级表现。用一键方案可以三分钟解决常规场景用手动方案可以搞定所有奇怪场景配上虚拟显示器加per-device脚本基本就是配置一次全设备通用的最终形态。如果你在配置过程中遇到具体的黑边场景不妨按照速查表一步步过90%以上都能自己解掉。剩下的10%多半是某个特别小众的组合那就只能结合具体设备版本和App版本来逐个试了。