news 2026/8/24 17:16:52

MirrorCaster 完全实战指南:三步把 Android 手机投屏到电脑,1080P 下平均延迟低至 28ms

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MirrorCaster 完全实战指南:三步把 Android 手机投屏到电脑,1080P 下平均延迟低至 28ms

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 # 投屏效果演示动图

操作步骤:

  1. 克隆仓库:git clone https://gitcode.com/gh_mirrors/mi/MirrorCaster
  2. 用 Visual Studio 打开MirrorCaster.sln,编译通过后运行MirrorCaster.exe
  3. 手机 USB 接电脑(手机上点"允许调试"),点界面上的开始投屏,输入码率(默认 30Mbps 即可),手机画面就出来了

延迟到底多低:三台手机真机实测

官方用了一个相当硬核的测法:手机运行 UFOTEST 的丢帧测试,用慢动作摄影机同时拍手机和电脑两块屏幕,随机取三帧,比较两块屏幕上格数的差值再乘每帧时长,取平均值得到显示延迟。三台测试机全是 USB 2.0 连接:

机型处理器 / 系统屏幕分辨率帧率平均显示延迟
Xiaomi MIX 3骁龙 845 / MIUI 11(Android 10)1080×234060FPS28.42ms
Xiaomi MIX 2骁龙 835 / MIUI 11(Android 9)1080×216060FPS41.66ms
Google Pixel 3 XL骁龙 845 / Android 101440×296060FPS57.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 直播时:

  1. 先把手机切到横屏应用页面,再点"确定"开始投屏(该模式不跟随画面旋转和分辨率自适应);
  2. 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=WxHrefresh-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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 17:15:44

AI生成科学模拟代码的可靠性挑战与Judge Agent解决方案

1. 从“生成”到“可信”&#xff1a;科学模拟的AI可靠性鸿沟 最近和几个做计算物理和计算化学的朋友聊天&#xff0c;大家不约而同地提到了同一个痛点&#xff1a;AI生成的科学模拟代码&#xff0c;看起来很美&#xff0c;跑起来很悬。这几乎是所有尝试将大语言模型引入科研工…

作者头像 李华
网站建设 2026/8/24 17:13:38

LLM智能体安全新范式:自适应评估与带外防御实战解析

1. 项目概述&#xff1a;当LLM智能体学会“见招拆招”最近在折腾LLM智能体&#xff08;LLM Agents&#xff09;的安全测试&#xff0c;特别是那个老生常谈却又防不胜防的“提示词注入”&#xff08;Prompt Injection&#xff09;。大家可能都听说过&#xff0c;给智能体发个“忽…

作者头像 李华
网站建设 2026/8/24 17:12:04

SysDVR:免费把 Switch 游戏画面串流到电脑的完整教程

SysDVR&#xff1a;免费把 Switch 游戏画面串流到电脑的完整教程 【免费下载链接】SysDVR Stream switch games to your PC via USB or network 项目地址: https://gitcode.com/gh_mirrors/sy/SysDVR SysDVR 是一个开源免费的项目&#xff0c;跑在 Switch 上后可以把正在…

作者头像 李华
网站建设 2026/8/24 17:11:08

Change2Task:从代码变更到自动化任务生成的方法论与实践

1. 从代码变更到可执行任务&#xff1a;一个被忽视的自动化起点在软件开发的日常中&#xff0c;我们早已习惯了各种自动化流程&#xff1a;代码提交触发CI/CD流水线&#xff0c;自动运行测试、构建镜像、部署到环境。但有一个环节&#xff0c;始终高度依赖人工介入&#xff0c;…

作者头像 李华