简体中文 | English
局域网投屏接收端 —— 把手机上的视频或整块屏幕无线投到电脑上播放的免费开源软件。支持 DLNA / UPnP(DMR)推送与 AirPlay 隔空播放双协议:iPhone / iPad / Mac 走系统「屏幕镜像」 即连即投,安卓手机与各类 App 走 DLNA 投屏,电脑这边装好即接收。
C++20 + 自绘 UI(nanovg / GLFW),Windows 与 Linux 一等公民。
播放态界面(无边框 + 上下贴边半透明栏 + 不操作自动隐去 + 悬停时间线出缩略图),默认皮肤「暗灰橙」(GNOME 深灰 + Ubuntu 橙):
内置 8 套皮肤只替换颜色与圆角 token,布局完全一致;把自定义皮肤 JSON 放进用户皮肤目录 skins/,托盘「重载皮肤」即可热加载。
到 Releases 下载对应平台的安装包(每次发布四件齐全 + SHA256SUMS.txt):
| 平台 | 文件 | 说明 |
|---|---|---|
| Windows | FlashRec-<ver>-win64.zip |
便携版,解压即用 |
| Windows | FlashRec-<ver>-win64-setup.exe |
安装版(Inno Setup,免管理员) |
| Debian / Ubuntu | flashrec_<ver>_amd64.deb |
deb 包 |
| Linux 通用 | FlashRec-<ver>-x86_64.AppImage |
全捆绑,直接运行 |
- AirPlay 镜像接收(v0.6.0 新增):iPhone / iPad / Mac 打开系统「屏幕镜像」即连即投, 无需安装任何 App。基于 UxPlay 协议栈从零重写适配,内置 AirPlay 接收端。
- 音画同步:以音频为主钟的时基方案,真机实测
a−v = 0.000s;起播延迟 7.577s → 0.100s,稳态接收积压 0.57~0.60s 持续不增长。 - 双协议并存:AirPlay 与 DLNA 常驻监听,任意新投屏自动接管(后到即最新内容)。
- 标准 DLNA DMR(数字媒体渲染器):AVTransport / RenderingControl / ConnectionManager 三服务齐全,手机系统投屏、bilibili、腾讯视频等支持 DLNA 的 App 可直接发现并把视频 投屏到电脑。
- 多网卡正确:「谁问就按谁回」—— M-SEARCH / SOAP / GENA 按对端所在网段回复, ALIVE / BYEBYE 每块网卡各发一份,URLBase 按请求 Host 头生成。多网卡机器不再出现 「投屏成功但连不上」。
- 自绘 UI:不依赖系统控件,各平台 / DPI 表现一致;常驻托盘,关窗即最小化到托盘 (设备保持在线),真正退出走托盘菜单。
- 皮肤系统:界面全部 token 化,由 JSON 皮肤驱动(
assets/skins.json);内置 8 套 皮肤,settings.json的ui.skin选择;用户皮肤目录放自定义 JSON,托盘「重载皮肤」 热加载,改色无需重启。 - 智能画面填充:按窗口 / 舞台比例自适应 cover / contain,竖屏镜像完整显示、不留 多余黑边;DLNA 直链电影仍由皮肤 fit 决定,不会被误裁。
- 播放:libmpv 后端,硬解优先;老显卡 / 驱动的 GL 渲染链不可用时自动降级到软件 渲染,显卡驱动异常(SEH 兜底)也能接住并降级续播。
- 投屏呈现:多屏可选、按屏记忆、自动全屏。
- 倍速播放:控制栏 0.5x–3.0x 七档选择(点击弹出列表),记住上次档位;直播回流 延迟追赶自动倍速消费(scaletempo2 不变调)。
- 自动更新(v0.6.4 新增):启动后自动检查新版本,直连与代理按实测下载速度择优, 后台静默下载并校验,完成后再提示安装;更新模块独立线程运行,不阻塞播放与投屏。
前置:CMake ≥ 3.24、Ninja、C++20 编译器(MSVC 2022 或 GCC 12+)。
# 1. 拉取第三方源码(pupnp / libmpv / nanovg / GLFW / spdlog / uxplay)
bash tools/fetch_deps.sh
# 2. 配置并构建
cmake --preset win-msvc && cmake --build build # Windows(MSVC + Ninja)
cmake --preset linux-gcc && cmake --build build # Linux(GCC/Clang + Ninja)平台注意事项:
- Windows:pupnp 依赖 pthreads4w,而
fetch_deps.sh不管它,需自行构建并 安装到third_party/pthreads4w/install(配置和打包脚本都按这个前缀找)。 MSVC 工具链路径集中在tools/msvc_env.sh(source它可拿到 cmake / ninja / cl 的绝对路径),按你的 VS 安装位置改一次即可。 - Linux:需
cmake ninja-build;要打 AppImage 还得有patchelf;启用 AirPlay 还需libssl-dev libplist-dev(系统包)。 - AirPlay(v0.6.0):
fetch_deps.sh会自动 clone UxPlay(pin57ea834)并在 Windows 上经 vcpkg 准备 openssl / libplist(含 OPENSSL_Applink)。构建开关-DFR_AIRPLAY=ON/OFF,开发默认 OFF(产物不含 GPL 组件),发布口径钉 ON (tools/package_windows.sh已固定)。
默认构建为无控制台窗口(Windows GUI 子系统);需要看日志时用 flashrec --console
启动,或配置 -DFLASHREC_CONSOLE=ON 构建一个带控制台的版本。控制台按 UTF-8 输出,
中文日志不再乱码。
bash tools/package_windows.sh # → dist/FlashRec-<ver>-win64.zip
# + FlashRec-<ver>-win64-setup.exe(Inno Setup)
bash tools/package_linux.sh # → dist/flashrec_<ver>_amd64.deb
# + FlashRec-<ver>-x86_64.AppImage两条脚本都支持 --only(zip|exe / deb|appimage)、--skip-build、--clean、--smoke。
Linux 那条必须在 Linux 上跑(依赖推导与 AppImage 工具都是 Linux 专属)。
也可以不本地打包:推送 v* tag 后由 GitHub Actions
自动构建双平台四件并挂到 Release(workflow_dispatch 可手动触发只出 artifact)。
启动后程序常驻托盘。手机与电脑处于同一局域网:
- DLNA 投屏:用任意支持 DLNA 的 App 投屏到「FlashRec」即可。
- AirPlay 镜像:iPhone / iPad / Mac 打开系统「屏幕镜像」,选择「FlashRec」即可
整屏实时投送;支持 PIN 码验证模式(配置
airplay.pin_auth)。
关闭窗口 = 最小化到托盘(设备仍在线);退出请用托盘菜单。AirPlay 与 DLNA 同时在线, 任意新投屏自动接管当前会话。
换肤:编辑 settings.json 把 ui.skin 改成内置皮肤 id(nord-snow / nord-frost /
nord-rose / nord-iris / nord-night / nord-forest / ubuntu-orange /
ubuntu-orange-square),或在用户皮肤目录放入自己的 JSON 后点托盘「重载皮肤」。
界面语言:默认跟随系统界面语言(settings.json 的 ui.language,auto / zh-CN /
en-US);右键菜单「语言」子菜单或托盘菜单底部两个语言项可即时切换,无需重启。
v0.6.4 起内置自动更新,更新模块运行在独立工作线程,不阻塞播放、投屏或界面:
- 检查时机:启动后 30 秒检查一次,之后每 4 小时一次;托盘菜单「检查更新」可手动
触发。相关键:
update.startup_delay_sec/update.check_interval_hours。 - 测速与切换:GitHub API 直连与
update.proxies中的代理并发赛跑,按完整下载 API 响应体的吞吐(B/s)排序,最快者胜出,不设直连优先;胜出端点优先复用,下载 安装包前还会以清单做第二轮测速排序。全部失败按 15 分钟 → 1 小时 → 6 小时 → 24 小时退避,网络恢复后自动继续。 - 静默下载:检测到新版本后在后台下载,SHA-256 校验通过后顶栏出现更新图标(皮肤 按钮左侧);悬停显示「更新软件」,点击弹出安装向导,确认安装器启动后主程序退出。 不再自动弹窗。
- 安装:Windows 安装版弹出安装向导完成升级并重启;便携版打开下载目录手动替换; AppImage 退出后自动替换并重启;deb 打开所在目录手动安装。
- 首次可用版本:自动更新链从 v0.6.4 开始生效。v0.6.3 及更早版本需手动下载一次 v0.6.4,此后(v0.6.4 → v0.6.5 起)由应用内自动更新完成。
代理配置在 settings.json 的 update 组(Windows:%APPDATA%\FlashRec\settings.json,
Linux:$XDG_DATA_HOME/FlashRec/settings.json 或 ~/.local/share/FlashRec/settings.json)。
prefix 直接拼在 GitHub URL 前,template 用 {url} 占位(两者二选一),enabled
控制启停:
"update": {
"enabled": true,
"auto_check": true,
"auto_download": true,
"direct_enabled": true,
"probe": { "timeout_ms": 4000, "concurrency": 4, "cache_sec": 600 },
"proxies": [
{ "name": "gh-proxy", "prefix": "https://gh-proxy.com/", "enabled": true },
{ "name": "my-mirror", "template": "https://example.com/gh/?url={url}", "enabled": true }
]
}update.api_base 可指向自建镜像 / 内网 Releases API(必须 HTTPS);关闭自动更新设
update.enabled=false,只检查不下载设 update.auto_download=false。更新器只向端点发送
版本检查与安装包请求,不上传账号、令牌或本地路径。
| 目录 | 职责 |
|---|---|
src/app/ |
事件总线、配置、日志、生命周期 |
src/dmr/ |
UPnP 设备与服务、SOAP 分发、GENA |
src/cast/ |
AirPlay 适配器(UxPlay lib 装配、TS 回流、会话生命周期) |
src/player/ |
mpv 封装(全项目唯一 mpv API 出入口)、播放状态机 |
src/ui/ |
nanovg 绘制、主题、视图与控件 |
src/platform/ |
窗口、托盘、防息屏、路径、网络接口枚举 |
cmake/ |
构建模块(依赖清单、平台开关、第三方补丁锚点、打包) |
assets/ |
随包资源:字体、图标、SCPD XML、默认配置、皮肤包 |
design/ |
皮肤设计真值(skins.json + 预览页) |
docs/ |
README 配图(界面预览) |
tools/ |
构建 / 打包 / 自检脚本 |
tests/ |
协议验收与自检脚本 |
架构上的几条硬约束(对改动很关键):ui / dmr / player 三者互不直接调用,只通过
事件总线通信;cast/ 同样只经事件总线投递指令、数据面走本机回环 TCP 喂 mpv;平台宏
只准出现在 src/platform/;播放状态机的唯一真值在 src/player/player_controller;
视觉 token 只写在 Theme 结构体,绘制代码零字面量色值。
本项目以 GNU GPLv3 授权,见 LICENSE。
- v0.6.0 起内置的 AirPlay 接收端静态链接 UxPlay
(GPLv3),官方发布包(
FR_AIRPLAY=ON)整体按 GPLv3 分发;为保持源码与发行版 一致,源码同样按 GPLv3 授权。 - 第三方组件的许可与来源见 THIRD_PARTY_NOTICES.md:libmpv 为 LGPLv2.1+ / GPLv2+ (本项目动态链接),nanovg / GLFW(zlib)、pupnp(BSD-3)、spdlog(MIT)等随其 上游分发。
