RTMP Camera Switcher:用一台电脑搞定大疆多机位转播的硬切台
项目地址:https://github.com/ddaihao2022/rtmp-camera-switcher (Electron + React,GPL-3.0,)
它解决什么问题
大疆设备(无人机、Osmo Action/Pocket、带图传的相机等)都支持直接向 RTMP 地址推流,但推流只能单路直出——多个设备各推各的流时,没有办法在一个画面里实时切换。传统做法要上 OBS 加插件,或者专业导播台。这个项目把多机位导播简化成一套桌面软件:所有设备往同一个局域网 RTMP 服务器推流,软件实时预览各路画面,按一个键就把任意一路全屏输出到 HDMI 显示器。
架构
单机跑两层,Electron 主进程里内嵌一个 Node.js 服务端:
- 服务端(Node.js):核心是 node-media-server,在本机 1935 端口收 RTMP 推流,同时通过 8000 端口提供 HTTP-FLV 给客户端低延迟拉流播放;3001 端口跑 Express API + Socket.io 做状态同步(流上下线、输出切换、音量状态实时推给界面)。流上线/掉线由 RTMP 事件(postPublish/donePublish)驱动,掉线时如果是当前输出源还会自动清空输出。
- Electron 客户端(React 18):四个窗口——1400×880 的主控窗(流列表 + 预览网格)、HDMI 输出窗(无边框全屏,推到第二块显示器)、音频混音窗、日志窗。
功能要点
- 多路预览:最多同时预览 4 路,单屏/网格视图
- HDMI 输出切换:任意一路全屏输出到第二显示器,切换实时生效,支持数字键 1–9 快切
- 音频混音台:独立窗口,VU 表 + 频谱 + 音量推子 + 静音
- 本地媒体导入:把本地视频/音频当虚拟流,和直播流同等参与切换(兜底插播素材用)
- 水印叠加:文字或图片,低透明度叠在输出画面上
- 输出录制:录制当前输出画面,WebM/MP4
低延迟的实现细节
源码里有两处针对性优化:RTMP 配置 gop_cache: false,并且给 node-media-server 的 postPlay 打了运行时补丁跳过 GOP 缓存重放,延迟控制在 1 秒以内;另外还 hook 了 NMS 内部的广播/包处理函数做吞吐诊断,verbose 模式下每 5 秒输出一路流的收包/发包统计。
工程细节也到位:自动探测本机局域网 IP(优先 192.168 段)并在侧边栏直接显示完整推流地址,省得手动查 IP;日志可运行时通过 API 或界面开关 verbose,支持关键词过滤和导出。打包产物是 Windows NSIS 安装包 / macOS dmg / Linux AppImage,作者已做软著登记。
典型使用流程
- 导播电脑启动应用(内嵌 RTMP 服务自动起在 1935 端口),接上第二块显示器
- 每台大疆设备在自家 App 里把直播推流地址设为 rtmp://<导播机IP>:1935/live/<设备名>
- 设备上线后出现在主控窗左侧列表,画面进预览网格
- 点某一路(或按数字键)→ 该画面全屏推到 HDMI 输出窗 → 现场大屏看到的就是它;录制和混音同步进行
一句话评价
把专业导播台的最小可用集(多路收录、预览、硬切、混音、监看输出、录制)用 RTMP + HTTP-FLV 这套通用管线在普通电脑上复刻出来的轻量方案,针对性解决了大疆这类能推 RTMP 但没有多机位切换能力的设备的现场转播问题。
限制:预览上限 4 路,无转场/画中画等软切特效(属于硬切台);推流和拉流鉴权当前都是关闭的(auth: play/publish false),所以它定位是可信局域网内的现场工具,不要把 1935/8000 端口暴露到公网。
别忘了点颗星喵
这篇提到的
来自 GitHub