一个最小可用的 macOS DLNA Renderer。启动后,手机上的 DLNA 投屏软件可以发现 Mac DLNA Casting,并把视频 URL 推送到 Mac 窗口播放。
npm install
npm startnpm start 会先编译再启动 Electron。
如果 Electron 下载很慢,可以使用镜像源:
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm install生成本机 macOS .app:
npm run package:mac生成 macOS .dmg 安装包:
npm run dist:mac产物会输出到 release/。本项目未配置 Apple 开发者签名,打包时会跳过代码签名。
仓库包含 GitHub Actions 工作流:
.github/workflows/build-mac.yml
触发条件:
- push 到
main - 向
main发起 Pull Request - 手动
workflow_dispatch
CI 会在 macOS runner 上执行:
npm ci
npm run typecheck
npm run dist:mac构建完成后,.dmg 会作为 artifact 上传,名称为 mac-dlna-casting-dmg。
- 确保手机和 Mac 在同一个局域网。
- 启动本应用。
- 在手机 DLNA App 里选择投屏设备
Mac DLNA Casting。 - 选择视频并投送到该设备。
首次运行时,macOS 可能会弹出本地网络访问权限,请允许,否则手机可能搜不到设备。
调试日志面板默认隐藏。需要排查时,在应用窗口中按 Cmd+Shift+L 打开或关闭 最近请求。
排查要点:
- 能看到
SetAVTransportURI:Mac 已收到视频地址。 - 能看到
Play:手机端已要求播放。 - 能看到
视频无法播放:协议已通,问题通常是视频格式、编码或手机端给出的 URL 无法被 Chromium 播放。 - 只能看到
SSDP search,看不到POST /service/...:手机发现了设备,但控制请求没有打到 Mac,优先检查本地网络权限、防火墙、手机和 Mac 是否在同一个网段。
- SSDP 设备发现
- UPnP 设备描述与服务描述
AVTransport:设置视频 URL、播放、暂停、停止、跳转、状态查询RenderingControl:音量、静音ConnectionManager:协议能力查询- Electron 窗口内 HTML5 video 播放
播放能力取决于 Chromium 的 <video>。第一版适合 mp4、部分 mov、部分 HLS。遇到 mkv、部分 ts、特殊编码或 HEVC 兼容问题时,后续需要接入 mpv 或 ffmpeg 做播放器后端。