Files
eric 5f1b9db2dc 焕新网络/系统页 UI,并加入基于出口的分流诊断与 Nomadro 场景推荐。
简化分流文案与手动检测交互,系统页对齐管线/芯片/ScoreRing 设计语言;README 同步更新。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 20:09:40 -05:00

598 lines
28 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 无人直播助手
Windows 桌面端 **抖音 → YouTube 无人转播** 控制台:内置 Electron 客户端、FastAPI 控制面(`web2`、FFmpeg 推流 worker、多频道 Pro、推流诊断。
[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
[![Electron](https://img.shields.io/badge/electron-33-blue.svg)](https://www.electronjs.org/)
[![Platform](https://img.shields.io/badge/platform-Windows-blue.svg)]()
> 录制核心基于 [DouyinLiveRecorder](https://github.com/ihmily/DouyinLiveRecorder) 生态Linux 全功能服务端可参考同级项目 **sh2**`d2ypp2`)。本仓库侧重 **Windows 懒人包 + Electron 控制台**。
---
## 目录
- [快速开始](#快速开始)
- [产品定位](#产品定位)
- [系统架构](#系统架构)
- [仓库结构](#仓库结构)
- [界面与功能](#界面与功能)
- [功能开关](#功能开关)
- [web2 API](#web2-api)
- [配置与数据路径](#配置与数据路径)
- [单频道与多频道 Pro](#单频道与多频道-pro)
- [网络诊断 / IP 画像 / 代理](#网络诊断--ip-画像--代理)
- [推流诊断 / 质量守卫 / 转播历史](#推流诊断--质量守卫--转播历史)
- [youLIVE 目标端监控](#youlive-目标端监控)
- [摄像头直推](#摄像头直推)
- [外部拉流转推](#外部拉流转推)
- [会员登录门禁(可选)](#会员登录门禁可选)
- [开发与构建](#开发与构建)
- [打包发布](#打包发布)
- [环境变量](#环境变量)
- [故障排查](#故障排查)
- [相关文档](#相关文档)
- [许可证](#许可证)
---
## 快速开始
### 最终用户(便携包)
1. 运行发布包中的 **无人直播助手** 可执行文件。
2. 打开 **直播** 页,在界面中填写:
- YouTube **串流密钥**Studio → 直播 → 串流设置);
- **源站地址**(抖音直播间 URL每行一个
3. 点击 **开始直播**;在 **当前直播日志** 中查看业务状态与 FFmpeg 输出。
### 开发者
```bash
cd electron
pnpm install
pnpm dev
```
首次开发若缺少离线 Python/FFmpeg可在 `electron/` 下执行 `pnpm prepare:runtime`
仅调试后端 API仓库根目录
```bash
pip install -r requirements.txt
uvicorn web2:app --host 127.0.0.1 --port 8001 --reload
```
---
## 产品定位
| 场景 | 说明 |
|------|------|
| **无人转播** | 从抖音等源站拉流,经本机 FFmpeg 推送到 YouTube RTMPS。 |
| **值守运行** | 通过内置 `BuiltinSupervisor`(或可选 PM2管理 `youtube2.py``douyin_youtube_ffplay.py` 等 worker。 |
| **桌面控制台** | Electron 提供直播、网络、系统等页面。 |
| **多路 Pro** | 多组「一个抖音直播间 ↔ 一个 YouTube 串流密钥」并行,进程名 `youtube2__{channelId}`。 |
**配对原则(强制)**
- 一个抖音直播间地址只对应 **一个** YouTube 串流密钥;
- **禁止** 同一抖音向多个 YouTube 推流;
- **禁止** 多个抖音共用同一密钥。
---
## 系统架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Electron 渲染进程 (React + Vite) │
│ 直播 / 摄像头 / 拉流 / 网络 / 系统 │
└───────────────────────────┬─────────────────────────────────────┘
│ preload (contextBridge)
┌───────────────────────────▼─────────────────────────────────────┐
│ Electron 主进程 │
│ · 启动 uvicorn (web2:app) │
│ · sql.js → client-data.sqlite │
│ · 托盘、深链 --nav= │
│ · YouTube Studio 系统浏览器侧车 │
│ · youLIVE 服务(监听 / 弹幕 / 桌面通知 / 本地 SQLite
└───────────────────────────┬─────────────────────────────────────┘
│ http://127.0.0.1:8001可 0.0.0.0
┌───────────────────────────▼─────────────────────────────────────┐
│ web2.py (FastAPI) │
│ 进程启停 / 状态诊断 / 配置读写 / Pro / 质量守卫 / 会话历史 │
└───────────────────────────┬─────────────────────────────────────┘
┌───────────────────┼───────────────────┐
▼ ▼ ▼
youtube2.py douyin_youtube_ffplay.py camera_youtube.py
│ │ │
│ pull_stream_youtube.py │
└──────── FFmpeg + Supervisor / PM2 ────────────────┘
```
| 模块 | 文件 | 职责 |
|------|------|------|
| Worker | `youtube2.py`, `douyin_youtube_ffplay.py`, `main.py` | 拉流、转码、推流 |
| 控制面 | `web2.py` | HTTP API |
| 运行时诊断 | `web2_process_runtime.py` | `business_status`、FFmpeg 速度/帧数 |
| 质量守卫 | `web2_quality_guard.py` | 推流质量评分 |
| 网络测速 | `web2_network.py` | 境内外可达性、上下行测速、分流判断(基于本机出口 IP |
| 网络路由 | `web2_network_routes.py` | `/network_status``/ip_profile``/ip_quality` 路由与缓存 |
| IP 画像 | `web2_ip_profile.py` | 出口 IP 类型(住宅/机房/代理)、洁净度评分、分流检测 |
| IP 质量 | `web2_ip_quality.py` | 代理/VPN/机房风险、流媒体解锁探测 |
| 功能开关 | `web2_feature_flags.py`, `electron/src/shared/featureFlags.ts` | 摄像头/拉流 UI 与 API 显隐 |
| youLIVE | `electron/src/youlive/` | YouTube 监听、弹幕、账号、桌面通知 |
| 主进程 | `electron/src/main/` | 运行时打包、IPC、本地 DB |
| 界面 | `electron/src/renderer/` | React SPA |
| 转播历史 | `web2_relay_log.py` | 会话 SQLite、日志导入 |
| 配置治理 | `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 拉流转推 |
---
## 仓库结构
```
.
├── electron/ # 无人直播助手Electron + React
│ ├── src/main/ # 主进程
│ ├── src/preload/ # contextBridge
│ ├── src/renderer/ # UI直播 / 摄像头 / 拉流 / 网络 / 系统)
│ │ ├── components/worker/ # 业务工作台(链路条 / 清单 / 指标)
│ │ └── components/network/ # 网络页(链路条 / IP 诊断 / 场景推荐 / 测速图)
│ ├── src/shared/ # 前后端共享featureFlags、monetizationLinks
│ ├── src/youlive/ # 内嵌 youLIVE主进程服务 + 共享类型)
│ └── scripts/ # 离线运行时、图标
├── web2.py # FastAPI 入口
├── web2_network_routes.py # 网络 / IP 相关 API 路由与缓存
├── web2_*.py # 其他后端子模块
├── third_party/IPQuality/ # IP 质量检测脚本参考ip.sh
├── config/ # 运行配置
├── backup_config/__web__/ # 配置自动备份
├── 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/ # 补充文档
└── requirements.txt
```
---
## 界面与功能
| 页面 | 说明 |
|------|------|
| **直播** | 抖音源站无人转播:单频道 / Pro、链路诊断、转播历史、youLIVE 目标端监控 |
| **摄像头** | 本机采集直推:设备预览、采集/编码配置、独立控制台(进程 `camera_youtube` |
| **拉流** | 外部流转推RTMP/SRT/HLS/FLV/WHEP 拉流、转码或流复制(进程 `pull_stream_youtube` |
| **网络** | 链路诊断、境内外测速、IP 画像与质量、WebRTC 泄露检测、FFmpeg 代理 |
| **系统** | 本机硬件与资源占用;手动「开始检测」,快照优先 |
**直播** 页面向抖音无人转播业务,含 Pro 多频道、三层链路诊断、转播历史等。
**摄像头** / **拉流** 页各自独立 UI 与工作流,不复用直播页布局;侧栏深链可直达(见下表)。默认构建中这两项为**隐藏**状态,见 [功能开关](#功能开关)。
**网络** 页采用链路管线布局:源站 / 分流 / YouTube / 上行四段可视化;进入页面先读本地快照,**仅点击右上角「开始检测」** 才触发完整测速与 IP 检测(见 [网络诊断 / IP 画像 / 代理](#网络诊断--ip-画像--代理))。
**系统** 页与网络页同一交互与视觉语言:**进入读快照,右上角「开始检测」**含资源管线、快检芯片、ScoreRing 与磁盘列表。
| 深链参数 | 页面 | 说明 |
|----------|------|------|
| `--nav=record` | 直播 | 默认页Windows 任务栏快捷方式 |
| `--nav=camera` | 摄像头 | 本机采集直推 |
| `--nav=pull` | 拉流 | 外部流转推 |
| `--nav=network` | 网络 | 测速与代理(`--nav=proxy` 同义) |
| `--nav=system` | 系统 | 负载、路径、会员门禁 |
**业务工作台**(摄像头 / 拉流共用 `components/worker/`
- **WorkerFlowStrip**:三段链路条(采集/拉流 → 处理/编码 → YouTube 输出),按 `business_status` 着色
- **WorkerChecklist**:启动前配置清单(设备/地址、密钥、码率等),未就绪项显示提示
- **WorkerMetrics**:推流中展示 FFmpeg 速度、帧序号、worker 进程数与业务状态
直播页能力摘要:
- **自适应轮询**:推流中 ~0.8s,空闲 ~4s后台标签 ~30s
- **链路诊断**:源站 / 推流 / 目标三层检查(`GET /youtube/diagnostics`
- **YouTube 目标端监控**:监听地址写入 `youtube_channels.json`,与转播线路绑定
- **桌面通知**:推流未到达 YouTube、目标端下播、弹幕关键词需 youLIVE 桌面通知开启)
- **转播历史**PM2 状态自动记会话;支持从 PM2 日志导入
- **配置历史备份**:保存前自动备份,界面可恢复
- **YouTube Studio**:系统浏览器打开,便于核对密钥
- **源站预览**:解析抖音 URL 并尝试显示主播昵称
- **配对校验**Pro 多线路保存时检测抖音地址 / YouTube 密钥跨频道重复,冲突时展示横幅并阻止启动
**网络** 页面向转播前的出口与链路自检,含:
- **开始检测**:右上角唯一操作按钮;检测中显示「检测中…」,完成后仍显示「开始检测」
- **链路快检**:国内源站 / Google / 分流 / 海外上行 / 录制代理五项状态芯片
- **NetworkPipeline**:源站 → 分流 → YouTube → 上行;分流结论为 **已分流 / 未分流 / 待确认**
- **境内外站点卡**Google 与抖音延迟、上下行测速Google 不可达时可跳转海外节点方案
- **场景推荐**Google 不通 → VPS 教程IP 质量差 → 静态住宅 IP外链 [Nomadro](https://nomadro.com/)
- **出口 IP**`GET /ip_profile`):当前出口单卡片 + IP 诊断板(`IpDiagnosticsBoard`
- **IP 质量**`GET /ip_quality`):风险因子与流媒体解锁状态
- **测速趋势图**`NetworkSpeedChart` 记录近期上下行采样
- **FFmpeg 代理**:页面底部 `ProxySettings`,与 Windows 系统代理独立
- **本地快照**:进入页面读 workspace 缓存;分流逻辑过旧时提示重新检测
**系统** 页资源自检,含:
- **SystemPipeline**CPU → 内存 → 显卡 → 磁盘四段渐变管线,流动箭头与 shimmer 动效
- **资源快检芯片**emoji + 状态标记CPU / 内存 / NVENC / 磁盘)
- **ScoreRing 卡片**CPU / 内存环形进度 + 进度条(管线/芯片已展示摘要,此处给明细)
- **本机信息卡**6 项 emoji 卡片hover 光晕动画
> 摄像头 / 拉流功能默认在导航中**隐藏**(见 [功能开关](#功能开关)),代码与 API 仍保留,可按需开启。
---
## 功能开关
摄像头直推与外部拉流转推在代码中完整保留,但**默认关闭** UI 与相关 API便于精简发布包。需要时分别修改前后端开关
| 开关 | 文件 | 变量 |
|------|------|------|
| 后端 API / worker 发现 | `web2_feature_flags.py` | `SHOW_CAMERA_FEATURE`, `SHOW_PULL_STREAM_FEATURE` |
| 前端导航与深链 | `electron/src/shared/featureFlags.ts` | `SHOW_CAMERA_UI`, `SHOW_PULL_STREAM_UI` |
关闭时:
- 侧栏不显示 **摄像头** / **拉流** 入口;
- 深链 `--nav=camera` / `--nav=pull` 自动回落到 **直播** 页;
- `GET /camera/*``GET/POST /pull_stream/*` 返回功能已禁用提示;
- PM2 / 进程发现列表忽略 `camera_*``pull_stream_*` worker。
---
## web2 API
默认:`http://127.0.0.1:8001``WEB2_PORT` 可改)。
| 分类 | 路径 | 说明 |
|------|------|------|
| 健康 | `GET /health` | 存活(无需鉴权) |
| 进程 | `GET /process_monitor` | 任务列表(含 Pro 频道) |
| 进程 | `GET /start` `/stop` `/restart` | 参数 `process=` |
| 状态 | `GET /status?process=` | 进程状态 + 业务诊断 + FFmpeg 指标 |
| 配置 | `GET/POST /youtube/ini_model` | 结构化 `youtube.ini` |
| 配置 | `GET/POST /get_url_config` `save_url_config` | `URL_config.ini` |
| 配置 | `GET /config/backups?file=` | 历史备份列表 |
| 配置 | `POST /config/restore` | 恢复(`file`, `backupId` |
| Pro | `/relay_pro/*` | 多频道 CRUD、密钥、URL、YouTube 监听地址、live_status |
| 诊断 | `GET /youtube/diagnostics` | 源站 / FFmpeg / 目标三层诊断 |
| 诊断 | `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` | 测速与代理(`force_refresh=1` 强制重检) |
| 网络 | `GET /ip_profile` | 出口 IP 画像(`client_tz``client_lang``webrtc_leak``force_refresh` |
| 网络 | `GET /ip_quality` | IP 质量与流媒体解锁(`force_refresh` |
| 系统 | `GET /system_metrics` `GET /host/gpu_status` | 主机、磁盘、NVENC`force_refresh` |
| OAuth | `GET /youtube/oauth/*` | Google 拉取串流密钥UI 可关) |
**可选鉴权**`config/web2_api_token.txt``WEB2_API_TOKEN` 存在时,除 `/health` 外需:
```http
Authorization: Bearer <>
```
Electron 主进程自动注入 API 鉴权头。
---
## 配置与数据路径
| 路径 | 用途 |
|------|------|
| `config/youtube.ini` | 单路密钥与 `[youtube]` 选项GPU、分辨率、RTMPS |
| `config/URL_config.ini` | 单路源站 URL 列表 |
| `config/youtube_channels.json` | Pro 频道元数据(见 `youtube_channels.example.json` |
| `config/relay_pro/url_config.ch_*.ini` | 每频道源站地址 |
| `config/relay_pro/youtube.ch_*.ini` | 每频道密钥(后端物化) |
| `config/web2_api_token.txt` | API 鉴权密钥 |
| `config/web2_bind_host.txt` | 监听地址(懒人包默认 `127.0.0.1`;局域网访问可设 `0.0.0.0` 并配置 token |
| `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 本地事件与快照 |
示例 `config/youtube_channels.json`
```json
{
"version": 1,
"channels": [
{
"id": "ch_a",
"name": "路线A",
"douyinUrl": "https://live.douyin.com/123456789",
"youtubeKey": "xxxx-xxxx-xxxx-xxxx"
}
]
}
```
---
## 单频道与多频道 Pro
### 单频道
1. 填写 `config/youtube.ini` 中的串流密钥。
2. 填写 `config/URL_config.ini` 中的抖音直播间地址。
3. **直播** 页选择 `youtube2`**开始直播**
### 多频道 Pro
1. 直播页打开 **Pro** 开关。
2. 界面新增频道,或编辑 `config/youtube_channels.json`
3. 每频道进程:`youtube2__{channelId}`,独立密钥与 URL 文件。
4. 网格内按频道启停;预检要求密钥与源站均已配置。
---
## 网络诊断 / IP 画像 / 代理
**网络** 页帮助在开播前确认「抖音源站可达 + 海外出口可用 + 上行带宽足够」。
### 检测方式
| 行为 | 说明 |
|------|------|
| 进入页面 | 读取 Electron workspace 本地快照(若有),**不自动发起网络请求** |
| 点击「开始检测」 | 并行请求 `network_status``ip_profile``ip_quality``proxy_config`,均带 `force_refresh=1` |
| 后端缓存 | `web2_network_routes.py`:网络 300s、IP 画像 300s、IP 质量 600s同 key 并发请求合并 |
### 链路诊断(`GET /network_status`
| 检测项 | 说明 |
|--------|------|
| 国内源站 | 抖音域名可达性与延迟 |
| Google 出口 | YouTube 推流路径可达性 |
| 分流 | 基于**本机默认出口 IP** 与海外采样 IP、Google/抖音可达性判断(`meta.logic_version=2`),结论:**已分流 / 未分流** |
| 运营商 | 本机宽带 ISP 单独展示,不混在分流文案中 |
| 海外测速 | 参考上下行 Mbps测速失败不代表无法推流 |
| 录制代理 | `config/ffmpeg_proxy.ini` 是否已配置 |
### IP 出口画像(`GET /ip_profile`
参考 whoer / ping0.cc 维度,聚合 ip-api.com、ping0.cc 等数据源:
- **当前出口**单卡片IP、类型住宅/机房/代理/移动)、洁净度评分
- 默认出口与海外采样 IP 对比 → 分流检测项(**两路 IP 相同 / 不同**
- 浏览器侧 **WebRTC 本地候选**检测(`useWebRtcLeak`),结果通过 `webrtc_leak` 参数回传后端
### IP 质量检测(`GET /ip_quality`
集成 [xykt/IPQuality](https://github.com/xykt/IPQuality) 思路(参考 `third_party/IPQuality/ip.sh`
- 代理、VPN、Tor、机房等风险因子
- 多源 Abuser / IPQS 评分
- YouTube、TikTok、Netflix、Disney+ 等流媒体解锁状态
### 场景推荐与外链
根据检测结果在页面内展示一条诊断式建议(非弹窗):
| 条件 | 推荐 |
|------|------|
| Google 不可达 | 境外 VPS 自建节点、YouTube 单独走代理 |
| Google 可达且 IP 质量偏低 | 静态住宅 ISP 出口 |
教程与延伸阅读跳转 [Nomadro](https://nomadro.com/)URL 带 `utm_source=wuren-live``topic` 参数;逻辑见 `electron/src/shared/monetizationLinks.ts``networkOfferLogic.ts`
### FFmpeg 代理
`GET/POST /proxy_config` 读写 `config/ffmpeg_proxy.ini`,供 `youtube2` 等 worker 拉流时使用,与 Windows 系统代理设置独立。
> IP 检测依赖外部公开 API结果仅供参考不构成安全或合规保证。
---
## 推流诊断 / 质量守卫 / 转播历史
`GET /status``business_status` 示例:
| 状态 | 含义 |
|------|------|
| `streaming` | 正在推流 |
| `relay_slow` | 推流速度低于实时 |
| `source_stalled` | FFmpeg 进度停滞 |
| `youtube_key_rejected` | YouTube 拒绝 RTMPS |
| `waiting_source` | 等待源站开播 |
| `misconfigured` | 配置不完整 |
| `monitoring` | 在线监测中 |
**链路诊断**`GET /youtube/diagnostics` → 源站 / FFmpeg / 目标三层检查与综合评分。
**质量守卫**`GET /youtube/quality_guard` → FFmpeg 指标与告警(诊断层内部复用)。
**转播历史**`runtime/youtube_relay/sessions.sqlite`
- PM2 `online` / 停止时自动开闭会话;
- `/status` 轮询时从日志同步主播与时长;
- 界面 **从日志导入** 可解析历史 PM2 输出。
---
## youLIVE 目标端监控
内嵌于 Electron 主进程的 **youLIVE** 模块(`electron/src/youlive/`),通过 preload 暴露 `window.youlive` API为直播页提供 YouTube **目标端**能力,与 `web2` 控制的 **源站推流** 互补。
| 能力 | 说明 |
|------|------|
| **监听列表** | 按 YouTube 频道 / 直播页 URL 轮询开播状态、观众数 |
| **转播绑定** | 将监听地址写入 `youtube_channels.json``youtubeWatchUrl`,与 Pro 线路一一对应 |
| **弹幕抓取** | 直播进行中拉取聊天消息,支持关键词告警 |
| **桌面通知** | 推流未到达 YouTube、目标端下播、弹幕关键词命中时通知需在 youLIVE 设置中开启) |
| **本地存储** | `youlive` SQLite 保存监听项、会话、告警历史 |
直播页 **YouTube 目标端监控** 面板在 Pro / 单路模式下自动同步监听地址。
---
## 摄像头直推
**摄像头** 页面向本机采集业务,采用独立 **业务工作台** 布局:
- **顶部 Hero**:设备摘要、链路条(采集 → 编码 → YouTube、配置清单与启停按钮
- **左侧**`CameraLocalPreview` 实时画面预览
- **下方三栏**设备选择、编码参数、YouTube 密钥与高级选项
- **推流中**:右侧展示 `WorkerMetrics`FFmpeg 速度 / 帧序号 / 业务状态)
进程名 `camera_youtube`,与抖音转播 `youtube2` 独立,请勿同时开启冲突 worker。
1. 选择 **视频设备** / **音频设备**`GET /camera/devices` 枚举 DirectShow
2. 设置分辨率、帧率、码率;可选 NVENC。
3. 填写 YouTube **串流密钥**(复用 `config/youtube.ini`)。
4. 点击 **开始直播**
配置:`config/camera_live.ini`(模板 `config/camera_live.example.ini`)。
---
## 外部拉流转推
**拉流** 页面向已有流媒体管线:从 SRS、OBS、其他节点提供的地址拉流转码或复制后推到 YouTube Live。布局与摄像头页一致的业务工作台
- **顶部 Hero**:拉流地址摘要、协议预设芯片、链路条(拉流 → 处理 → YouTube、配置清单与启停
- **下方三栏**:处理策略(协议/转码/码率、YouTube 密钥、高级参数SRT 延迟、重连、额外 FFmpeg 参数)
- **推流中**:展示实时 FFmpeg 指标与业务状态
进程名 `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`)。
---
## 会员登录门禁(可选)
默认 **关闭**(无登录 UI启动直播无账号要求
开启:**系统** → **客户端与系统集成****会员登录限制**
- 侧栏显示登录/注册;
- 开始/重启前需 PocketBase 会员(`X-PB-Token`
- 状态键:`localStorage``pb_auth_gate_enabled`
---
## 开发与构建
| 组件 | 版本 |
|------|------|
| Node.js | 18+ |
| pnpm | 10+ |
| Python | 3.10+(开发机;发布包自带运行时) |
| 命令(在 `electron/` | 说明 |
|------------------------|------|
| `pnpm dev` | 开发模式 |
| `pnpm build` | 编译到 `out/` |
| `pnpm prepare:runtime` | 准备离线 Python/FFmpeg |
| `pnpm verify:runtime` | 校验运行时 |
| `pnpm dist` | Windows 便携包 |
---
## 打包发布
```bash
cd electron
pnpm install
pnpm dist
```
产物:`electron/dist/` 便携版。仓库根(除 `electron/`)打入 `resources/backend/`,用户机无需单独安装 Python。
---
## 环境变量
| 变量 | 说明 |
|------|------|
| `WEB2_PORT` | API 端口,默认 `8001` |
| `WEB2_HOST` | 监听地址(优先于 `web2_bind_host.txt` |
| `WEB2_API_TOKEN` | API 密钥 |
| `WEB2_SUPERVISOR` | 进程后端Pro 多频道勿强制 PM2 |
| `VITE_API_BASE` | 渲染进程 API 根(非 Electron 调试) |
| `VITE_WEB2_API_TOKEN` | 开发用 Bearer |
---
## 故障排查
| 现象 | 处理 |
|------|------|
| 无法启动 / 服务未就绪 | 查 uvicorn 日志;确认 8001 未被占用;`pnpm verify:runtime` |
| YouTube 无画面 | 看 `youtube_key_rejected`;核对 Studio 密钥;检查 RTMPS 与代理 |
| `relay_slow` / 掉帧 | 查 NVENC降分辨率关占用 CPU 的程序 |
| Pro 无法启动 | 勿 `WEB2_SUPERVISOR=pm2`;每频道密钥与 URL 已保存;检查配对冲突横幅 |
| 摄像头无画面 | 确认 DirectShow 设备名与 `camera_live.ini` 一致;尝试关闭 GPU 编码 |
| 拉流连接失败 | 核对协议与 URLSRT 检查 caller/streamidWebRTC 建议经 SRS 转 RTMP |
| 拉流有画面 YouTube 无 | 流复制模式下源可能非 H.264+AAC改转码模式 |
| 目标端监听无数据 | 直播页确认 `youtubeWatchUrl` 已填写youLIVE 桌面通知已开启 |
| Google 不可达 / 未分流 | **网络** 页点「开始检测」;配置 TUN/规则或 FFmpeg 代理;排障提示链至 Nomadro 教程 |
| 分流显示旧长文案 | 后端规则已更新,点「开始检测」刷新;旧快照含「本机宽带…」会被自动判定过期 |
| IP 画像显示机房/代理 | 更换住宅出口或调整代理节点;关注 WebRTC 泄露提示 |
| 网络/系统一直「检测中」 | 勿依赖自动轮询;手动点「开始检测」;查 8001 后端是否响应 |
| IP 质量检测超时 | 外网 API 偶发慢;稍后刷新;检查本机防火墙 |
| 摄像头/拉流入口不见 | 默认功能开关为关,见 [功能开关](#功能开关) |
| 配置误改 | 直播页 **历史备份**`POST /config/restore` |
日志:
- Worker`.pm2/logs/` 或界面「当前直播日志」
- 客户端:系统页打开「客户端日志」目录
---
## 相关文档
| 文档 | 说明 |
|------|------|
| [docs/YOUTUBE_LIVE_SEO.md](docs/YOUTUBE_LIVE_SEO.md) | YouTube 直播 SEO |
| [docs/REALTIME_AUDIO_DEMUCS.md](docs/REALTIME_AUDIO_DEMUCS.md) | 实时音频 Demucs |
---
## 许可证
本项目继承上游 DouyinLiveRecorder 及相关依赖的许可证条款。使用第三方平台直播服务请遵守各平台服务条款。