/LiveRecorder

基于Streamlink的全自动直播录制工具,已支持哔哩哔哩、斗鱼、虎牙、抖音、YouTube、Twitch等

Primary LanguagePythonMIT LicenseMIT

LiveRecorder

简介

一款无人值守直播录制脚本,基于强大的Streamlink 实现多平台直播源录制,通过挖掘直播平台官方API以轮询方式实现直播开播检测,致力于用最少的代码实现最多的功能

已支持平台

  • 哔哩哔哩
  • 斗鱼
  • 虎牙
  • 抖音
  • YouTube
  • Twitch
  • NicoNico
  • TwitCasting
  • Afreeca
  • Pandalive
  • Bigolive
  • Pixiv Sketch
  • Chaturbate
  • 更多平台欢迎PR

说明

  • 不建议同时录制过多直播,可能会出现不可预见的问题
  • 部分直播平台(如Pandalive)存在风控,请谨慎使用
  • 因个人精力有限,小众直播平台的支持可能存在问题,新增直播平台欢迎PR
  • 本脚本仅用于无人值守录制,有关UI界面和录制拆分等通过后期软件可以实现的功能不考虑添加

已知bug

  • YouTube在录制单个频道多开直播间时会出现频繁中断,暂时无法修复
  • 斗鱼直播因使用js引擎可能出现偶发的解析错误,会自动重试录制
  • Bigolive存在部分用户录制花屏,原因未知

使用

安装FFmpeg

FFmpeg官方下载页面

根据你的运行平台安装对应版本,并添加环境变量确保全局调用

下载

当前支持Windows, Mac和Linux平台(amd64架构),请前往Release下载对应平台的可执行程序

Release下载页面

下载解压后修改配置,直接运行二进制文件即可

源码运行

在不支持的平台运行时可使用源码运行,安装好Python后在命令行输入以下命令即可

# 下载源码(没有git可以直接从release下载Source code)
git clone https://github.com/auqhjjqdo/LiveRecorder.git
cd LiveRecorder
# 安装依赖
python3 -m pip install .
# 源码运行
python3 live_recorder.py

配置

配置文件存储于config.json,该文件位于可执行程序相同目录

修改示例配置文件config.sample.json后务必重命名为config.json

文件内容要求严格按照json语法,请前往在线json格式化网站校验后再修改

代理配置

proxy的值为代理地址,支持http和socks代理,格式为protocol://[user:password@]ip:port

例如http://127.0.0.1:7890socks5://admin:passwd@127.0.0.1:1080

建议优先使用http代理,目前socks5代理存在一定兼容性问题

无需代理时去除引号填写null或删除该字段即可

输出目录配置

output字段为录制文件输出后保存的目录路径,非必填字段(请勿填写空字符串),默认输出到运行目录的output文件夹

路径分隔符请使用/,防止出现转义导致的不兼容问题

支持相对路径和绝对路径,例如output/video/tmp/outputD:/output

直播录制配置

按照示例修改user列表,注意逗号、引号和缩进

字段 含义 可填内容 是否必填 备注
platform 直播平台 直播平台的英文名或拼音 必填 必须为首字母大写
id 直播用户id 直播平台的房间号或用户名 必填 参考config文件示例格式
一般在直播网址即可找到
name 自定义主播名 任意字符 非必填 用于录制文件区分
未填写时默认使用id
interval 检测间隔 任意整数或小数 非必填 默认检测间隔为10秒
format 输出格式 例如tsflvmp4mkv
详见FFmpeg官方文档
非必填 默认使用直播平台的直播流输出格式
output 输出目录 输出目录配置相同 非必填 优先级高于输出目录配置
proxy 代理 代理配置相同 非必填 优先级高于代理配置
headers HTTP 标头 参考官方文档 非必填 可用于部分需请求头验证的网站
cookies HTTP Cookie key=value
多个cookie使用;分隔
非必填 可用于录制需登录观看的直播

注意事项

哔哩哔哩的房间号

部分主播的B站房间号在使用网页打开时地址栏默认显示的是短号,并不是真实的房间号,如需获取真实房间号可以打开

https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=短号

返回的数据中room_id后的数字即真实房间号

哔哩哔哩的清晰度

由于哔哩哔哩的限制,未登录用户无法观看较高画质的直播,因此需要在配置文件中添加cookies字段(仅需SESSDATA)以获取原画清晰度的直播流

斗鱼的房间号

斗鱼直播同哔哩哔哩在部分直播间的房间号显示的是短号,获取真实房间号可打开F12开发者工具,在控制台输入room_id,返回的数字即真实房间号

YouTube的频道ID

YouTube的频道ID一般是由UC开头的一段字符,由于YouTube可以自定义标识名,打开YouTube频道时网址会优先显示标识名而非频道ID

获取YouTube的频道ID可以使用以下网站:

https://seostudio.tools/zh/youtube-channel-id

https://ytgear.com/youtube-channel-id

NicoNico的用户ID和频道ID

NicoNico的直播分为用户直播和频道直播,其ID分别以coch开头再加上一段数字,但NicoNico的直播间一般是以lv开头的视频ID,获取用户ID或频道ID可在F12开发者工具的控制台输入NicoGoogleTagManagerDataLayer[0].content,在返回的数据中community_idchannel_id的值即对应的用户ID或频道ID

其中部分频道在使用频道ID时无法获取到最新直播,此问题暂时无解,请使用lv视频ID代替

TwitCasting的检测间隔

由于直播检测请求使用了HTTP Keep-Alive长连接防止频繁建立TCP通道导致性能下降,但TwitCasting的服务器要求10秒内无请求则关闭连接,所以配置文件在添加TwitCasting的直播时尽量加入interval 字段并将检测间隔设为小于10秒,以免频繁出现请求协议错误

输出文件

输出文件会在录制结束后使用ffmpeg封装为配置文件自定义的输出格式,音视频编码为直播平台直播流默认(一般视频编码为H.264 ,音频编码为AAC),录制清晰度为最高画质,封装结束后自动删除原始录制文件,输出格式为空或未填写时不进行封装

输出文件名命名格式为[年.月.日 时.分.秒][平台][主播名]直播标题.格式,日期时区为系统默认时区