|
1 | | -# 🎥 MultiPush · 多目标直播推流工具 |
| 1 | +# MultiPush|多目标直播推流工具 |
2 | 2 |
|
3 | | -> **本地摄像头 / RTSP / 媒体文件 → 一键推流到多个 RTMP/RTMPS 平台** |
4 | | -> 内置本地 RTMP 预览、MP4 录制、配置保存、自动依赖下载与更新检查。 |
| 3 | +> RTSP / 本地摄像头 / 媒体文件 → 多平台 RTMP/RTMPS(tee)推流,带预览、录制、自愈重连、定时调度与无头运行。GUI / `--headless` / `systemd` 三种方式一把梭。 |
| 4 | +
|
| 5 | +--- |
5 | 6 |
|
6 | 7 |  |
7 | 8 |
|
| 9 | + |
| 10 | +## 🆕 与旧版(单文件大脚本)相比有什么更新? |
| 11 | + |
| 12 | +- **模块化工程**:将原本“一个 `main.py` 管天下”的代码,按职责拆分为入口、UI、对话框、线程(推流/预览/录制)、工具函数等模块,结构清晰、便于维护与测试。入口只负责模式分发;UI 与线程解耦,通过信号连接。 |
| 13 | +- **三种运行形态**: |
| 14 | + - 桌面 GUI; |
| 15 | + - **无头 Headless**(服务器/后台)`--headless`; |
| 16 | + - **systemd 服务**安装/卸载(`--install-service` / `--uninstall-service`)。 |
| 17 | +- **任务行式 UI 与托盘**:多路“源→多目标”以列表行呈现,支持**全部启动/全部停止**、托盘驻留与一键显示/隐藏窗口。 |
| 18 | +- **输入源更全面**:RTSP、媒体文件、**本地摄像头(Windows dshow / Linux v4l2 / macOS avfoundation)**三类输入统一适配,分平台参数完备。 |
| 19 | +- **现代化对话框组件**:使用说明、免责声明、捐赠、**现代化消息框**(统一信息/警告/错误样式)等模块独立封装,样式自适应浅/深主题。 |
| 20 | +- **“获取推流码”辅助**(可选):集成抓包线程(基于 pyshark / tshark)尝试自动解析平台推流地址与密钥,带超时与停止控制。 |
| 21 | +- **升级检查更稳健**:支持多镜像 URL、宽松 JSON 解析、下载进度、SHA256 校验与“最低支持版本”强提醒。 |
| 22 | +- **定时调度**:可选“时间窗内自动运行”,内置 30 秒心跳检查与偏好项联动保存。 |
| 23 | +- **预览与录制解耦**:预览线程使用 FFmpeg 管道输出 rawvideo 到 UI;录制线程单独管理推流/预览互斥,支持 RTSP 与本地摄像头。 |
| 24 | +- **更完善的错误与引导**:Help/FAQ/故障排查页签,涵盖常见报错与排查步骤;提供“导出日志 / 复制诊断信息 / 打开配置目录”。 |
| 25 | + |
8 | 26 | --- |
9 | 27 |
|
10 | | -## 🌟 功能特性 |
| 28 | +## ✨ 功能特性 |
11 | 29 |
|
12 | | -- 🎦 支持 **本地摄像头 / RTSP 流 / 媒体文件** 作为输入源 |
13 | | -- 🚀 一次推流到多个 RTMP / RTMPS 平台(如 YouTube、Bilibili、Facebook、抖音等) |
14 | | -- 🖥️ 内置 **本地 RTMP 服务器(MediaMTX)**,实现实时预览 |
15 | | -- 🎧 自动检测音视频设备,支持静音推流 |
16 | | -- 💾 一键录制 MP4(支持边录边播) |
17 | | -- ⚙️ 自动检查更新 + 依赖缺失下载(FFmpeg / MediaMTX) |
18 | | -- 🌓 可选暗色主题(检测到 `qdarkstyle` 自动启用) |
19 | | -- 💖 内置“请作者喝杯咖啡”与“使用说明”窗口 |
| 30 | +- **一对多推流(tee)**:单路输入同时推送到多个 RTMP/RTMPS 目标,默认 H.264/AAC 编码(720p@30)。 |
| 31 | +- **输入类型**:`rtsp://`、本地文件(可循环 `-stream_loop`)、本地摄像头(分平台后端与音频组合)。 |
| 32 | +- **自愈重连/健康状态**:线程化推流与日志输出,异常自动重试(详见日志与状态栏)。 |
| 33 | +- **可视化预览**:独立预览线程,按需开启/关闭;摄像头预览期间自动联动按钮状态。 |
| 34 | +- **本地录制 MP4**:支持 RTSP/摄像头录制,文件输入不重复编码保存。 |
| 35 | +- **托盘与批量操作**:全部启动/停止、隐藏到托盘后台运行。 |
| 36 | +- **一键更新**:latest.json → 下载 → 校验 → 打开安装包,全流程引导。 |
20 | 37 |
|
21 | 38 | --- |
22 | 39 |
|
23 | | -## 📦 环境要求 |
| 40 | +## 📦 目前项目结构 |
24 | 41 |
|
25 | | -- **Windows 10 / 11 (x64)** |
26 | | -- **Python 3.10+** |
27 | | -- 已安装 **pip** |
28 | | -- (可选)FFmpeg 与 MediaMTX 会自动下载,无需手动安装 |
| 42 | +```text |
| 43 | +tui/ |
| 44 | +├─ main.py # 入口(GUI / --headless / systemd 安装) |
| 45 | +├─ requirements.txt # 依赖(PyQt5) |
| 46 | +├─ README.md # 项目说明文档 |
| 47 | +├─ app_prefs.json # 应用程序偏好设置 |
| 48 | +├─ multipush_pairs.json # 配置文件(任务对列表) |
| 49 | +├─ assets/ # 资源文件目录 |
| 50 | +│ ├─ app.ico # 应用图标 |
| 51 | +│ ├─ certs/ # 证书目录 |
| 52 | +│ │ └─ cacert.pem # CA证书 |
| 53 | +│ ├─ donate/ # 捐赠相关 |
| 54 | +│ │ └─ poster.png # 捐赠海报 |
| 55 | +│ ├─ ffmpeg/ # FFmpeg工具 |
| 56 | +│ │ └─ bin/ # FFmpeg二进制文件目录 |
| 57 | +│ ├─ icons/ # 图标资源 |
| 58 | +│ │ └─ [各种图标文件] # 各种UI图标 |
| 59 | +│ └─ wireshark/ # Wireshark工具及依赖(pyshark/tshark 可选) |
| 60 | +│ └─ [Wireshark相关文件] # 程序及依赖 |
| 61 | +└─ multipush/ # 核心模块 |
| 62 | + ├─ __init__.py # 包初始化 |
| 63 | + ├─ constants.py # 常量、路径、resource_path |
| 64 | + ├─ ffmpeg_utils.py # FFmpeg 检测/下载/CA 证书解析 |
| 65 | + ├─ headless.py # --headless 运行逻辑 |
| 66 | + ├─ systemd_utils.py # systemd 安装/卸载 |
| 67 | + ├─ threads/ # 线程模块 |
| 68 | + │ ├─ stream_thread.py # 主推流(多目标 tee + 复用/转码/参数) |
| 69 | + │ ├─ record_thread.py # 录制(RTSP/摄像头) |
| 70 | + │ └─ preview_thread.py # 预览(rawvideo 管道 → UI) |
| 71 | + └─ ui/ # UI模块 |
| 72 | + ├─ dialogs.py # 帮助/免责声明/捐赠/消息框等组件 |
| 73 | + ├─ main_window.py # 主窗口:任务行/托盘/更新/定时/日志等 |
| 74 | + └─ widgets.py # 采集设备选择/地址编辑/抓包辅助等 |
| 75 | +``` |
29 | 76 |
|
30 | 77 | --- |
31 | 78 |
|
32 | | -## 🚀 安装与运行 |
| 79 | +## 🚀 快速开始 |
33 | 80 |
|
34 | | -### 🧰 方式一:直接运行 Python 源码 |
35 | | -```bash |
36 | | -git clone https://github.com/eisongao/MultiPush.git |
37 | | -cd MultiPush |
| 81 | +### 环境需求 |
| 82 | +- Python 3.8+、PyQt5、FFmpeg(程序会做可用性检查/引导安装)。 |
38 | 83 |
|
39 | | -# 安装依赖 |
| 84 | +### 安装依赖 |
| 85 | +```bash |
40 | 86 | pip install -r requirements.txt |
| 87 | +``` |
41 | 88 |
|
42 | | -# 运行程序 |
43 | | -python main.py |
| 89 | +### 启动方式 |
| 90 | +GUI(默认) / 无头 / 服务安装示例同入口脚本注释中的说明: |
| 91 | +- GUI:`python main.py` |
| 92 | +- 无头:`python main.py --headless --config /path/to/multipush_pairs.json` |
| 93 | +- 安装服务:`sudo python main.py --install-service` |
| 94 | + |
| 95 | +--- |
| 96 | + |
| 97 | +## ⚙️ 配置说明 |
| 98 | + |
| 99 | +- **任务配置**:`multipush_pairs.json`(与 `app_prefs.json` 区分)。程序会在“加载配置”后把 `pairs` 同步到偏好路径,以便下次默认加载;保存/加载按钮在主界面工具栏。 |
| 100 | +- **常用操作**:添加/删除/复制任务行;上移/下移;全部启动/全部停止;导出/复制日志;主题切换;自动换行;定时窗口。 |
| 101 | + |
| 102 | +--- |
| 103 | + |
| 104 | +## 🖼️ 预览与录制 |
| 105 | + |
| 106 | +- **预览**:支持 RTSP / 文件 / 摄像头,预览对话框与线程绑定,关闭时安全回收;摄像头预览期间禁用“启动”以避免资源冲突。 |
| 107 | +- **录制**:支持 RTSP 与摄像头,媒体文件无需录制(可直接推流)。 |
| 108 | + |
| 109 | +--- |
| 110 | + |
| 111 | +## ❓帮助 / FAQ / 故障排查 |
| 112 | + |
| 113 | +内置**使用说明**对话框,含“快速开始 / 常见问题 / 故障排查”三页签,并提供“打开配置目录 / 导出日志 / 复制诊断信息”。 |
| 114 | +常见问题示例:RTMP(S) 连接失败、摄像头黑屏、无音频、自动重试提示、FFmpeg/tshark 未找到等。 |
| 115 | + |
| 116 | +--- |
| 117 | + |
| 118 | +## 🔐 免责声明 |
| 119 | + |
| 120 | +本软件仅供学习和技术研究使用;请遵守平台与当地法律法规;由违规使用导致的后果由使用者承担。内置独立的免责声明对话框可在 UI 中查看。 |
| 121 | + |
| 122 | +--- |
| 123 | + |
| 124 | +## 🗺️ 路线图 |
| 125 | + |
| 126 | +- [ ] 可选 NVENC/QSV 硬编预设 |
| 127 | +- [ ] 更细粒度的码率/分辨率按任务覆盖 |
| 128 | +- [ ] 跨平台打包与自动更新 |
| 129 | + |
| 130 | +--- |
| 131 | + |
| 132 | +## 📄 许可证 |
| 133 | + |
| 134 | +MIT(若无特别说明,以仓库 LICENSE 为准) |
| 135 | + |
| 136 | +--- |
44 | 137 |
|
45 | | -# 打包 |
46 | | -pyinstaller main.py --noconsole --icon "app.ico" --add-data "ffmpeg/bin;ffmpeg/bin" --add-data "assets;assets" --add-data "app.ico;." --name "MultiPush" |
| 138 | +**小结**:新版在**工程化、稳定性、用户体验与可运维性**上全面提升:更清晰的目录、可拔插的线程模块、现代化 UI/对话框、无头/服务化部署、健壮的升级渠道与辅助工具链(抓包/诊断/日志)。如果你是从旧版单文件脚本升级,直接按照“快速开始”运行即可。 |
0 commit comments