MirrorCaster 完全实战指南:三步把 Android 手机投屏到电脑,1080P 下平均延迟低至 28ms
【免费下载链接】MirrorCaster开源、高效、低延迟的Android投屏工具项目地址: https://gitcode.com/gh_mirrors/mi/MirrorCaster
MirrorCaster 是一款开源的 Android 投屏工具:手机侧用系统自带的 screenrecord 做 H.264 编码,编码流通过 adb 管道直接送进电脑端的 mpv 实时解码渲染,USB 连接下 1920×1080 分辨率能跑到 60FPS,实测平均显示延迟最低 28ms 出头。全部源码放在一个 C# WinForms 工程里,GPLv3 协议,想改哪里都能直接下手。
先说痛点:市面投屏方案差在哪
用云投屏 App 的话,画面要经过厂商服务器绕一圈,延迟动辄几百毫秒,玩快闪游戏基本没法看;用 Scrcpy 之类的命令行工具虽然快,但要自己拼命令、调参数,对新手不友好。MirrorCaster 的思路是:图形界面 + 内置 adb 和 mpv,你只管连手机、点按钮,编码、传流、解码整条链路它自动串好。
三步跑起来:编译、连手机、开投屏
环境要求很朴素:
| 项目 | 要求 |
|---|---|
| 电脑系统 | Windows |
| 运行框架 | .NET Framework 4.5 及以上 |
| 手机侧 | 开启 USB 调试(开发者选项里打开) |
| 依赖 | 无需额外安装,adb 与 mpv 已内置在lib/目录 |
仓库代码结构一目了然:
MirrorCaster/ ├── MirrorCaster/ │ ├── Program.cs # 程序入口,创建并运行主窗口 │ ├── MainForm.cs # 主窗口:投屏启停、码率设置、虚拟按键、设备信息轮询 │ ├── DeviceInfoData.cs # 设备信息:分辨率、刷新率、横竖屏状态 │ ├── StreamPipe.cs # 异步流管道,把 adb 的输出接到 mpv 的输入 │ ├── MirrorCaster.csproj # 工程文件 │ └── lib/ │ ├── adb/ # 内置 adb.exe 及 Windows 平台 DLL │ └── mpv/ # 内置 mpv.exe 播放器 ├── MirrorCaster.sln # Visual Studio 解决方案文件 └── images/demo.webp # 投屏效果演示动图操作步骤:
- 克隆仓库:
git clone https://gitcode.com/gh_mirrors/mi/MirrorCaster - 用 Visual Studio 打开
MirrorCaster.sln,编译通过后运行MirrorCaster.exe - 手机 USB 接电脑(手机上点"允许调试"),点界面上的开始投屏,输入码率(默认 30Mbps 即可),手机画面就出来了
延迟到底多低:三台手机真机实测
官方用了一个相当硬核的测法:手机运行 UFOTEST 的丢帧测试,用慢动作摄影机同时拍手机和电脑两块屏幕,随机取三帧,比较两块屏幕上格数的差值再乘每帧时长,取平均值得到显示延迟。三台测试机全是 USB 2.0 连接:
| 机型 | 处理器 / 系统 | 屏幕分辨率 | 帧率 | 平均显示延迟 |
|---|---|---|---|---|
| Xiaomi MIX 3 | 骁龙 845 / MIUI 11(Android 10) | 1080×2340 | 60FPS | 28.42ms |
| Xiaomi MIX 2 | 骁龙 835 / MIUI 11(Android 9) | 1080×2160 | 60FPS | 41.66ms |
| Google Pixel 3 XL | 骁龙 845 / Android 10 | 1440×2960 | 60FPS | 57.38ms |
几点解读:
- 28ms 意味着从手机发出画面到电脑显示只隔了不到两帧(60FPS 下每帧约 16.7ms),肉眼几乎感觉不到拖影;
- 同为骁龙 845,MIX 3 比 Pixel 3 XL 快了将近一倍——延迟差异主要来自手机侧 H.264 编码速度,而不是传输链路;
- 分辨率越高编码压力越大,Pixel 3 XL 的 1440P 屏就是因此拖了后腿。所以弱鸡机型可以把投屏分辨率调低换帧率。
链路拆解:screenrecord + StreamPipe + mpv 是怎么串起来的
整个投屏过程就是三个进程握手,核心逻辑都在 MainForm.cs 里,读这一百多行主逻辑就能完全看懂。
第一步:手机侧编码。通过内置的 adb 启动一条循环录屏命令,输出直接打到标准输出而不是存文件:
adb exec-out "while true;do screenrecord --bit-rate=30000000 --output-format=h264 --size 1920x1080 - ;done"while true循环很关键:screenrecord 单次最长跑 180 秒,循环保证录屏流不断线;--size由程序自动填入设备当前分辨率。
第二步:管道传输。StreamPipe.cs用 4KB 缓冲区做异步读写的搬运工——从 adb 进程的 stdout 读一块,就写一块进 mpv 的 stdin,写完立即 Flush,不积压。这就是"低延迟"的第一道保险。
第三步:mpv 硬解渲染。mpv 启动时带上了一整套为低延迟定制的参数,关键的几个:
| 参数 | 作用 |
|---|---|
--profile=low-latency--cache=no | 启用低延迟预设、禁用缓存 |
--framedrop=decoder--video-latency-hacks=yes | 帧率跟不上时直接丢帧,宁可少画不可积压 |
--hwdec=yes--vo=gpu | 硬件解码 + GPU 输出 |
--no-correct-pts --fps=60 | 按手机刷新率强制解码节奏(可选) |
--title="Mirror Caster Source" | 给窗口命名,方便 OBS 按窗口名捕获 |
渲染窗口还有个小巧思:内嵌模式(Internal)下程序调用SetParent把 mpv 的窗口句柄"搬"进主窗口的容器里,再配合分层窗口属性做穿透处理,你看到的就是一整个干净的窗口,而不是 mpv 的完整播放器界面。
界面里的四档"模式"(超低延迟 / 均衡偏低延迟 / 均衡偏稳定 / 稳定模式)本质上是切换 mpv 的取帧策略:超低延迟用--untimed来了就播,稳定模式则不做干预让 mpv 自己平滑。
进阶玩法:OBS 抓画面直播、码率怎么选、按键控制
独立窗口模式抓屏直播
主界面有"独立窗口"投屏模式,会单独弹出一个标题为Mirror Caster Source的 mpv 窗口。做 OBS 直播时:
- 先把手机切到横屏应用页面,再点"确定"开始投屏(该模式不跟随画面旋转和分辨率自适应);
- OBS 里添加"窗口捕获",模式选"捕获特定窗口",窗口选
[mpv.exe] Mirror Caster Source。
因为窗口标题固定,OBS 里配置一次就能长期复用,比抓屏幕区域稳定得多。
码率给多少?
开始投屏时会弹出码率输入框(单位 Mbps,上限 200),官方建议值:
| 传输方式 | 建议码率 |
|---|---|
| 互联网(异地 ADB) | <10 |
| USB(一般手机) | <30 |
| 百兆局域网(编码强的手机) | <100 |
| USB(旗舰编码能力) | ≤200 |
码率越高画质越好,但手机编码压力也越大,延迟会跟着涨。日常 USB 投屏用默认 30 就很稳,追求画质且手机是旗舰的话可以试 50~100。
虚拟按键远程操控
投屏期间界面会亮起一排按键:电源、返回、Home、多任务、菜单、音量加/减,全部通过adb shell input keyevent下发(源码见ADBKeySend相关方法,例如返回键对应KEYCODE_BACK)。演示和调试场景下不用拔线点手机,直接鼠标点点完事。
ADB 投屏常见坑与处理
- 提示"找不到任何设备或模拟器":手机没连上或没点"允许调试"。检查 USB 是否只开了充电模式,开发者选项里确认 USB 调试已开。
- 提示"multiple devices/emulators":同一台电脑插了多部开了调试的手机。断开其他设备,或在 ADB 里指定单台。
- 画面转屏后不同步:程序内置了心跳定时器,轮询
dumpsys window displays解析当前分辨率和刷新率(正则抓cur=WxH和refresh-rate … fps),检测到横竖屏切换会自动重启投屏换分辨率——内嵌模式下无需你操心,独立窗口模式则建议投屏前先摆好横屏。 - 手机断开提示"设备已断开连接":心跳轮询发现设备消失后会自动停止投屏并弹窗,重连手机再开即可。
- 帧率不稳:先切"均衡(偏向低延迟)"档位;还不行就把码率从 30 降到 10~16,或关掉硬件解码排除显卡驱动干扰。
二次开发从哪下手:三个文件讲透核心逻辑
代码量不大,改功能基本围绕三个文件转:
MirrorCaster/MainForm.cs(约 500 行):投屏启停、码率输入、四档模式参数表、设备信息轮询、虚拟按键,全在这。想加新的 mpv 参数,改StdIn()里拼参数的那一行即可;想加虚拟按键,照VolUpKeyButton_Click抄一个再绑个KEYCODE_*就行。MirrorCaster/StreamPipe.cs(约 50 行):纯异步管道,4KB 缓冲 + 取消令牌。想加流统计或断流重连逻辑,改Connect()里的循环体。MirrorCaster/DeviceInfoData.cs(10 行):设备宽高、刷新率、竖屏标志四个字段,是解析结果的载体,想扩展设备信息(比如电池温度)从这里加字段。
依赖层面,lib/adb/和lib/mpv/里的二进制是随工程一起分发的,替换更新版本的 adb 或 mpv 时注意保持目录结构不变,代码里是按AppDomain.CurrentDomain.BaseDirectory + @"lib\adb\adb.exe"这种相对路径硬编码加载的。
小结:适合谁用
如果你是直播主,需要把手机画面低延迟地送进 OBS;如果你是开发者,想要一个能直接读源码、随便魔改的 ADB 投屏基座;或者你就是受够了高延迟云投屏,只想安安静静把手机画面投到电脑上——MirrorCaster 用"screenrecord 编码 + adb 管道 + mpv 硬解"这套极简链路证明了:不开 Root、不装手机端 App,USB 2.0 上 28ms 的显示延迟完全够打。GPLv3 协议下随便读、随便改,商用注意保留许可证声明即可。
【免费下载链接】MirrorCaster开源、高效、低延迟的Android投屏工具项目地址: https://gitcode.com/gh_mirrors/mi/MirrorCaster
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考