新增拉流转推功能,并按业务重设计摄像头/拉流独立界面

支持 RTMP/SRT/HLS/FLV/WHEP 拉流到 YouTube;摄像头与拉流页采用独立工作台布局,更新 README 文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
eric
2026-07-07 21:16:43 -05:00
parent 9dd3a63109
commit 59ad853140
15 changed files with 2286 additions and 224 deletions

View File

@@ -23,6 +23,7 @@ Windows 桌面端 **抖音 → YouTube 无人转播** 控制台:内置 Electro
- [推流诊断 / 质量守卫 / 转播历史](#推流诊断--质量守卫--转播历史)
- [youLIVE 目标端监控](#youlive-目标端监控)
- [摄像头直推](#摄像头直推)
- [外部拉流转推](#外部拉流转推)
- [会员登录门禁(可选)](#会员登录门禁可选)
- [开发与构建](#开发与构建)
- [打包发布](#打包发布)
@@ -84,7 +85,7 @@ uvicorn web2:app --host 127.0.0.1 --port 8001 --reload
```
┌─────────────────────────────────────────────────────────────────┐
│ Electron 渲染进程 (React + Vite) │
│ 直播 / 摄像头 / 网络 / 系统
│ 直播 / 摄像头 / 拉流 / 网络 / 系统 │
└───────────────────────────┬─────────────────────────────────────┘
│ preload (contextBridge)
┌───────────────────────────▼─────────────────────────────────────┐
@@ -103,8 +104,9 @@ uvicorn web2:app --host 127.0.0.1 --port 8001 --reload
┌───────────────────┼───────────────────┐
▼ ▼ ▼
youtube2.py douyin_youtube_ffplay.py tiktok*.py
│ │
youtube2.py douyin_youtube_ffplay.py camera_youtube.py
│ │
│ pull_stream_youtube.py │
└──────── FFmpeg + Supervisor / PM2 ────────────────┘
```
@@ -118,6 +120,7 @@ uvicorn web2:app --host 127.0.0.1 --port 8001 --reload
| 配置治理 | `web2_config_governance.py` | 保存前备份、恢复 |
| 多频道 | `web2_relay_pro.py` | `youtube_channels.json``config/relay_pro/` |
| 摄像头 | `web2_camera.py`, `camera_youtube.py` | DirectShow 采集、NVENC 推流 |
| 拉流 | `web2_pull_stream.py`, `pull_stream_youtube.py` | RTMP/SRT/HLS/FLV/WHEP 拉流转推 |
| youLIVE | `electron/src/youlive/` | YouTube 监听、弹幕、账号、桌面通知 |
| 主进程 | `electron/src/main/` | 运行时打包、IPC、本地 DB |
| 界面 | `electron/src/renderer/` | React SPA |
@@ -131,7 +134,7 @@ uvicorn web2:app --host 127.0.0.1 --port 8001 --reload
├── electron/ # 无人直播助手Electron + React
│ ├── src/main/ # 主进程
│ ├── src/preload/ # contextBridge
│ ├── src/renderer/ # UI直播 / 摄像头 / 网络 / 系统)
│ ├── src/renderer/ # UI直播 / 摄像头 / 拉流 / 网络 / 系统)
│ ├── src/youlive/ # 内嵌 youLIVE主进程服务 + 共享类型)
│ └── scripts/ # 离线运行时、图标
├── web2.py # FastAPI 入口
@@ -141,6 +144,7 @@ uvicorn web2:app --host 127.0.0.1 --port 8001 --reload
├── runtime/youtube_relay/ # 转播会话 sessions.sqlite
├── src/ # 录制核心spider、stream、room…
├── camera_youtube.py # 摄像头→YouTube worker
├── pull_stream_youtube.py # 外部拉流→YouTube worker
├── douyin_youtube_ffplay.py # 抖音→YouTube 转播
├── youtube2.py # YouTube worker
├── docs/ # 补充文档
@@ -153,11 +157,16 @@ uvicorn web2:app --host 127.0.0.1 --port 8001 --reload
| 页面 | 说明 |
|------|------|
| **直播** | 单频道 / Pro抖音源站转播、密钥、监听、启停、链路诊断、转播历史 |
| **摄像头** | 物理摄像头 + 麦克风 → FFmpeg → YouTube`camera_youtube` 进程 |
| **直播** | 抖音源站无人转播:单频道 / Pro、链路诊断、转播历史、youLIVE 目标端监控 |
| **摄像头** | 本机采集直推:设备预览、采集/编码配置、独立控制台(进程 `camera_youtube` |
| **拉流** | 外部流转推RTMP/SRT/HLS/FLV/WHEP 拉流、转码或流复制(进程 `pull_stream_youtube` |
| **网络** | 测速、代理 |
| **系统** | 负载、开机启动、路径、会员登录限制开关 |
**直播** 页面向抖音无人转播业务,含 Pro 多频道、三层链路诊断、转播历史等。
**摄像头** / **拉流** 页各自独立 UI 与工作流,不复用直播页布局;侧栏深链 `--nav=camera` / `--nav=pull` 可直达。
直播页能力摘要:
- **自适应轮询**:推流中 ~0.8s,空闲 ~4s后台标签 ~30s
@@ -191,6 +200,8 @@ uvicorn web2:app --host 127.0.0.1 --port 8001 --reload
| 诊断 | `GET /youtube/quality_guard` | 质量评分(诊断内部复用) |
| 摄像头 | `GET /camera/devices` | FFmpeg 枚举音视频采集设备 |
| 摄像头 | `GET/POST /camera/config` | 读写 `camera_live.ini` |
| 拉流 | `GET/POST /pull_stream/config` | 读写 `pull_stream.ini` |
| 拉流 | `GET /pull_stream/protocols` | 协议预设与示例地址 |
| 历史 | `GET /youtube/relay/sessions` | 转播会话 |
| 历史 | `POST /youtube/relay/sessions/import` | 从 PM2 日志导入 |
| 网络 | `GET /network_status` `GET/POST /proxy_config` | 测速与代理 |
@@ -221,6 +232,7 @@ Electron 主进程自动注入 API 鉴权头。
| `config/google_oauth.example.json` | YouTube OAuth 模板 |
| `config/ffmpeg_proxy.ini` | FFmpeg 代理 |
| `config/camera_live.ini` | 摄像头采集参数(见 `camera_live.example.ini` |
| `config/pull_stream.ini` | 外部拉流参数(见 `pull_stream.example.ini` |
| `backup_config/__web__/` | 配置版本备份 |
| `runtime/youtube_relay/sessions.sqlite` | 转播会话库 |
| 用户数据目录 `client-data.sqlite` | Electron 本地事件与快照 |
@@ -298,21 +310,55 @@ Electron 主进程自动注入 API 鉴权头。
| **桌面通知** | 推流未到达 YouTube、目标端下播、弹幕关键词命中时通知需在 youLIVE 设置中开启) |
| **本地存储** | `youlive` SQLite 保存监听项、会话、告警历史 |
直播页 **YouTube 目标端监控** 面板在 Pro / 单路模式下自动同步监听地址;摄像头页亦可绑定 `youtube_watch_url` 做目标端校验
直播页 **YouTube 目标端监控** 面板在 Pro / 单路模式下自动同步监听地址。
---
## 摄像头直推
**摄像头**将本机物理摄像头 + 麦克风经 FFmpeg 直推 YouTube RTMPS进程名 `camera_youtube`(与抖音转播 `youtube2` 独立)
**摄像头**面向本机采集业务,布局为「预览 + 控制台」左侧实时画面预览右侧采集→编码→YouTube 链路状态与启停
1. 在界面选择 **视频设备** / **音频设备**(后端 `GET /camera/devices` 枚举 DirectShow 设备)
2. 设置分辨率、帧率、码率;可选 NVENC 硬件编码。
进程名 `camera_youtube`,与抖音转播 `youtube2` 独立,请勿同时开启冲突 worker
1. 选择 **视频设备** / **音频设备**`GET /camera/devices` 枚举 DirectShow
2. 设置分辨率、帧率、码率;可选 NVENC。
3. 填写 YouTube **串流密钥**(复用 `config/youtube.ini`)。
4. 可选填写 **YouTube 直播页地址** 供目标端监听
5. 点击 **开始直播**
4. 点击 **开始直播**
配置持久化于 `config/camera_live.ini`(模板 `config/camera_live.example.ini`)。
配置`config/camera_live.ini`(模板 `config/camera_live.example.ini`)。
---
## 外部拉流转推
**拉流** 页面向已有流媒体管线:从 SRS、OBS、其他节点提供的地址拉流转码或复制后推到 YouTube Live。
进程名 `pull_stream_youtube`
### 支持协议
| 协议 | 示例 |
|------|------|
| RTMP / RTMPS | `rtmp://127.0.0.1/live/stream` |
| SRT | `srt://host:10080?mode=caller&streamid=…` |
| HLS | `https://example.com/live/index.m3u8` |
| HTTP-FLV | `http://127.0.0.1:8080/live/stream.flv` |
| WebRTC (WHEP) | `whep://…`(需 FFmpeg 支持;否则经 SRS 转 RTMP/SRT |
| UDP / MPEG-TS | `udp://@:1234` |
### 处理模式
- **转码**默认H.264 + AAC兼容 YouTube
- **流复制**:源须已是 H.264 + AAC延迟更低
### 使用步骤
1. 打开 **拉流** 页,填写拉流 URL可点协议预设快速填入示例
2. 选择协议(可自动识别)、转码/复制、码率与 NVENC。
3. 填写 YouTube 串流密钥 → **开始转推**
4. SRT 延迟、断线重连、额外 FFmpeg 参数等在「高级参数」中配置。
配置:`config/pull_stream.ini`(模板 `config/pull_stream.example.ini`)。
---
@@ -380,7 +426,9 @@ pnpm dist
| `relay_slow` / 掉帧 | 查 NVENC降分辨率关占用 CPU 的程序 |
| Pro 无法启动 | 勿 `WEB2_SUPERVISOR=pm2`;每频道密钥与 URL 已保存;检查配对冲突横幅 |
| 摄像头无画面 | 确认 DirectShow 设备名与 `camera_live.ini` 一致;尝试关闭 GPU 编码 |
| 目标端监听无数据 | 确认 `youtubeWatchUrl` / `youtube_watch_url` 已填写youLIVE 桌面通知已开启 |
| 拉流连接失败 | 核对协议与 URLSRT 检查 caller/streamidWebRTC 建议经 SRS 转 RTMP |
| 拉流有画面 YouTube 无 | 流复制模式下源可能非 H.264+AAC改转码模式 |
| 目标端监听无数据 | 直播页确认 `youtubeWatchUrl` 已填写youLIVE 桌面通知已开启 |
| 配置误改 | 直播页 **历史备份**`POST /config/restore` |
日志: