Files
gitlab-instance-0a899031_d2…/README.md
DESKTOP-77LRNCU\dsx2016 caece7537a 同步 Pro 频道配置并补充 README 网络/IP 章节
更新频道 2 的 YouTube 密钥与抖音源站列表;完善网络诊断、IP 画像与功能开关文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 12:48:43 +08:00

599 lines
27 KiB
Markdown
Raw 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 控制台**。
---
## 目录
- [快速开始](#快速开始)
- [产品定位](#产品定位)
- [系统架构](#系统架构)
- [仓库结构](#仓库结构)
- [界面与功能](#界面与功能)
- [网络诊断与 IP 画像](#网络诊断与-ip-画像)
- [功能开关](#功能开关)
- [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_ip_profile.py` | 出口 IP 类型(住宅/机房/代理)、洁净度评分 |
| IP 质量 | `web2_ip_quality.py` | 代理/VPN/机房风险、流媒体解锁探测 |
| 功能开关 | `web2_feature_flags.py` | 摄像头/拉流 API 与 worker 显隐 |
| 转播历史 | `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 拉流转推 |
| IP 画像 | `web2_ip_profile.py` | 出口 IP 类型、住宅/机房判定、WebRTC 泄露联动 |
| IP 质量 | `web2_ip_quality.py` | 风险评分、流媒体解锁探测(参考 xykt/IPQuality |
| 功能开关 | `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 |
---
## 仓库结构
```
.
├── electron/ # 无人直播助手Electron + React
│ ├── src/main/ # 主进程
│ ├── src/preload/ # contextBridge
│ ├── src/renderer/ # UI直播 / 摄像头 / 拉流 / 网络 / 系统)
│ │ ├── components/worker/ # 业务工作台(链路条 / 清单 / 指标)
│ │ └── components/network/ # 网络页(链路条 / IP 画像 / IP 质量 / 测速图)
│ ├── src/shared/ # 前后端共享常量(功能开关 featureFlags
│ ├── src/youlive/ # 内嵌 youLIVE主进程服务 + 共享类型)
│ └── scripts/ # 离线运行时、图标
├── web2.py # FastAPI 入口
├── web2_*.py # 后端子模块(含 ip_profile / ip_quality / feature_flags
├── 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
├── third_party/IPQuality/ # IP 质量检测参考脚本ip.sh
├── docs/ # 补充文档
└── requirements.txt
```
---
## 界面与功能
| 页面 | 说明 |
|------|------|
| **直播** | 抖音源站无人转播:单频道 / Pro、链路诊断、转播历史、youLIVE 目标端监控 |
| **摄像头** | 本机采集直推:设备预览、采集/编码配置、独立控制台(进程 `camera_youtube` |
| **拉流** | 外部流转推RTMP/SRT/HLS/FLV/WHEP 拉流、转码或流复制(进程 `pull_stream_youtube` |
| **网络** | 链路诊断、境内外测速、IP 画像与质量、WebRTC 泄露检测、FFmpeg 代理 |
| **系统** | CPU/内存/磁盘/GPU、开机启动、路径、会员登录限制开关 |
**直播** 页面向抖音无人转播业务,含 Pro 多频道、三层链路诊断、转播历史等。
**摄像头** / **拉流** 页各自独立 UI 与工作流,不复用直播页布局;侧栏深链可直达(见下表)。默认构建中这两项为**隐藏**状态,见 [功能开关](#功能开关)。
**网络** 页采用链路管线布局:源站 / 分流 / YouTube / 上行四段可视化,配合实时测速曲线、境内外带宽对比、代理设置,以及 IP 画像与 IP 质量面板(见 [网络诊断与 IP 画像](#网络诊断与-ip-画像))。
| 深链参数 | 页面 | 说明 |
|----------|------|------|
| `--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 与抖音的延迟、上下行测速、解析 IP 与地区
- **IP 出口画像**`GET /ip_profile`):本机默认出口与海外出口的类型(住宅/机房/代理/移动、洁净度评分、WebRTC 本地泄露参考
- **IP 质量检测**`GET /ip_quality`):代理/VPN/Tor/机房风险因子、Abuser 评分、YouTube/Netflix 等流媒体解锁状态
- **测速趋势图**`NetworkSpeedChart` 记录近期上下行采样
- **FFmpeg 代理**:录制/推流专用 HTTP/SOCKS 代理,与系统代理设置联动
- **自动刷新**:约 45s 静默轮询WebRTC 检测完成后自动刷新 IP 画像
> 摄像头 / 拉流功能默认在导航中**隐藏**(见 [功能开关](#功能开关)),代码与 API 仍保留,可按需开启。
---
## 网络诊断与 IP 画像
**网络** 页在原有测速与代理基础上,新增出口画像与质量评估,帮助在推流前判断代理/VPN/机房 IP 是否适合 YouTube 转播。
| 能力 | 说明 |
|------|------|
| **链路管线** | 四段状态条:抖音源站可达性 → 分流路径 → Google/YouTube 延迟 → 上行带宽 |
| **测速曲线** | 境内外下载/上传 Mbps 实时采样与历史折线 |
| **IP 画像** | 本机默认出口与代理后海外出口对比ISP、ASN、住宅/机房/代理类型、洁净度评分 |
| **WebRTC 泄露** | 渲染进程轻量 STUN 探测本地私网候选,结果上报 `ip_profile` 参与评分 |
| **IP 质量** | 多源风险评分ipinfo、ipapi.is 等)、代理/VPN/Tor/机房因子、YouTube/TikTok/Netflix 等媒体解锁状态 |
| **代理设置** | FFmpeg 代理开关与 HTTP/SOCKS 地址,写入 `config/ffmpeg_proxy.ini` |
后端模块:
- `web2_ip_profile.py`:数据源 ip-api.com、ping0.cc、ipify
- `web2_ip_quality.py`Python 化集成 [xykt/IPQuality](https://github.com/xykt/IPQuality) 思路;参考脚本见 `third_party/IPQuality/ip.sh`
> IP 检测依赖外部公开 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/*` 返回功能已禁用提示。
---
## 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` | 测速与代理 |
| 网络 | `GET /ip_profile` | 出口 IP 画像(可选 `client_tz``client_lang``webrtc_leak` |
| 网络 | `GET /ip_quality` | IP 质量与流媒体解锁探测 |
| 系统 | `GET /system_metrics` `GET /host/gpu_status` | 主机、磁盘、NVENC |
| 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 画像 / 代理
**网络** 页帮助在开播前确认「抖音源站可达 + 海外出口可用 + 上行带宽足够」。
### 链路诊断(`GET /network_status`
| 检测项 | 说明 |
|--------|------|
| 国内源站 | 抖音域名可达性与延迟 |
| Google 出口 | YouTube 推流路径可达性 |
| 线路分流 | 对比境内外解析 IP判断代理/TUN 是否生效 |
| 海外测速 | 参考上下行 Mbps测速失败不代表无法推流 |
| 录制代理 | `config/ffmpeg_proxy.ini` 是否已配置 |
### IP 出口画像(`GET /ip_profile`
参考 whoer / ping0.cc 维度,聚合 ip-api.com、ping0.cc 等数据源:
- **默认出口**与**海外出口**(经 Google 探测路径采样)的类型标签
- 住宅 / 机房 / 代理 / 移动判定与洁净度评分
- 浏览器侧 **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+ 等流媒体解锁状态
### FFmpeg 代理
`GET/POST /proxy_config` 读写 `config/ffmpeg_proxy.ini`,供 `youtube2` 等 worker 拉流时使用,与 Windows 系统代理设置独立。
---
## 推流诊断 / 质量守卫 / 转播历史
`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`
---
## 功能开关
摄像头直推与外部拉流转推默认**关闭**(导航隐藏、相关 API 返回 404、PM2 忽略对应 worker以降低首屏复杂度。需要时分别修改
| 位置 | 常量 | 默认 |
|------|------|------|
| `electron/src/shared/featureFlags.ts` | `SHOW_CAMERA_UI``SHOW_PULL_STREAM_UI` | `false` |
| `web2_feature_flags.py` | `SHOW_CAMERA_FEATURE``SHOW_PULL_STREAM_FEATURE` | `False` |
前后端开关需保持一致。深链 `--nav=camera` / `--nav=pull` 在关闭时会回落到 **直播** 页。
---
## 开发与构建
| 组件 | 版本 |
|------|------|
| 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 代理 |
| IP 画像显示机房/代理 | 更换住宅出口或调整代理节点;关注 WebRTC 泄露提示 |
| 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 及相关依赖的许可证条款。使用第三方平台直播服务请遵守各平台服务条款。