这是一个基于 yt-dlp 和 ffmpeg 的网络视频推流工具。它提供了一个简单的Web界面,用于管理视频播放队列,并将来自YouTube、Bilibili等网站的视频流实时转码并推送到指定的RTMP服务器。
- 支持多平台: 目前支持从YouTube、Bilibili等多种视频网站获取视频与直播源(甚至支持P**nH*b)。
- Web操作界面: 通过网页轻松管理播放列表和推流状态。
- 视频队列系统: 支持将多个视频URL添加到播放队列,自动按顺序播放。
- 多平台支持: 利用
yt-dlp,支持从YouTube、Bilibili等多种视频网站获取视频源。 - 多推流端点: 可在配置文件中定义多个独立的推流端点,并分别进行管理。
- 实时转码: 使用
ffmpeg进行实时视频转码和推流。 - 硬件加速: 支持VA-API硬件加速(可在代码中配置),显著降低CPU使用率。
- 动态水印: 在视频画面上实时显示当前播放信息、队列状态、服务器性能等动态水印。
- 空闲待机流: 当播放队列为空时,自动推流一个包含状态信息的待机画面,避免断流。
- 灵活配置: 通过
config.json文件轻松配置所有参数。
- Python 3.x
- Flask:
pip install flask - ffmpeg: 确保已安装并添加到系统的
PATH环境变量中。若要使用硬件加速,请确保ffmpeg编译时已包含相应模块(如h264_vaapi)。 - yt-dlp: 确保已安装并添加到系统的
PATH环境变量中。
-
克隆仓库
git clone https://github.com/kurashizu/YoutubeStreamer.git cd streamer -
安装依赖
pip install flask
-
创建配置文件 将项目中的
config_sample.json复制一份并重命名为config.json。cp config_sample.json config.json
-
修改配置文件 根据您的需求,编辑
config.json文件。详细说明请参考下一章节。 -
运行应用
python3 app.py
服务启动后,您可以通过
http://<listening_addr>:<listening_port>访问Web操作界面。
配置文件分为几个主要部分:
base_url: 您的RTMP推流服务器的基础地址,例如rtmp://your-server/live/。streams: 一个字符串列表,定义了所有可用的推流密钥(也作为独立的管理端点)。最终推流地址将是base_url+stream_key。distributors: (可选) 一个对象列表,用于在Web界面上生成可复制的播放地址(例如CDN地址),方便观众选择。实际拉流地址为base_url+stream_key.m3u8,RTMP服务器需要支持HLS格式的直播流。
public_base_url: 此Web API服务的公开访问地址。前端界面会使用此地址与后端通信。listening_addr: Web服务监听的IP地址,0.0.0.0表示监听所有网络接口。listening_port: Web服务监听的端口。
cookie_file:youtube: (可选) 指向YouTube的cookie文件路径。bilibili: (可选) 指向Bilibili的cookie文件路径。
-
访问Web界面: 在浏览器中打开
http://<your-server-ip>:<port>。 -
选择推流端点: 在页面顶部的下拉菜单中,选择一个您想管理的推流端点 (Endpoint)。
-
添加视频到队列:
- 在 "Video URL" 输入框中粘贴一个视频链接 (例如
https://www.youtube.com/watch?v=...)。 - 您可以设置推流码率 (Bitrate)、是否仅音频 (Audio Only) 等参数。
- 点击 "Add to Queue" 按钮。
- 在 "Video URL" 输入框中粘贴一个视频链接 (例如
-
管理队列:
- 视频添加成功后,会出现在 "Playlist" 区域。
- 如果当前没有视频在播放,队列中的第一个视频会自动开始推流。
- 您可以点击视频旁边的 "Remove" 按钮将其从队列中删除。
-
监控状态:
- "Status" 区域会实时显示当前推流状态、
ffmpeg的日志输出以及性能信息。 - 您可以点击 "Terminate" 按钮来强制停止当前正在播放的视频。播放列表中的下一个视频会自动开始。
- "Status" 区域会实时显示当前推流状态、
本项目提供了一组简单的HTTP GET接口用于程序化控制。
-
GET /streamer/enqueue- 功能: 添加一个视频到队列。
- 参数:
endpoint,url,bitrate,audioOnly,FPS,GOP,index。
-
GET /streamer/dequeue- 功能: 从队列中移除一个视频。
- 参数:
endpoint,index。
-
GET /streamer/status- 功能: 获取指定端点的当前状态、日志和播放列表。
- 参数:
endpoint。
-
GET /streamer/terminate- 功能: 停止当前正在播放的视频。
- 参数:
endpoint。
- ffmpeg: 强大的音视频处理框架。
- yt-dlp: 功能丰富的视频下载工具。
- Flask: 轻量级的Web应用框架。