• Stars
    star
    663
  • Rank 67,681 (Top 2 %)
  • Language
    Java
  • License
    Other
  • Created over 5 years ago
  • Updated 11 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

pure-java B站/Acfun/斗鱼/虎牙/快手/抖音/YY/战旗/花椒 直播视频录制。仅需Java环境即可运行【维护模式,不主动新增Feature】

你指尖跃动的电光,是我此生不变的信仰

Go go go, Bilibili Pikachu!

BilibiliLiveRecorder

语言java 支持系统 Win/Linux/Mac 测试版本64位Win10系统, jre 1.8.0_101 开源协议Apache2.0
当前版本 CI Release 下载总量

支持Acfun/Bilibili/Douyu/Douyin/Huya/Kuaishou/Huajiao/Zhanqi/YY 直播录制

Instruction For Developers

😄作者的话

做了个Python版本的,支持A站/B站/斗鱼/快手,欢迎大家添砖加瓦 --> you-live

😄使用方法

  • 程序调用时传入参数即可(顺序可变)
    java -Dfile.encoding=utf-8 -jar BiliLiveRecorder.jar "debug=false&check=false&delete=false&liver=douyu&id=233233&qn=0&retry=5"
各参数意义
Key 必选 释义
options json配置文件位置。支持相对/绝对路径。默认config.json
charset json配置文件编码格式。默认UTF-8
debug debug模式,输出更多信息。默认false
check 下载完后是否校准时间戳,默认true
delete 校准后是否删除源文件,默认true
zip 是否压缩成zip文件,默认false
liver 将要录制的直播源。 详见下表
id 直播房间id,如未传入,后续将提示输入。
qn 直播视频清晰度。不同网站值意义不同。-1代表最高清晰度。
qnPri 直播视频清晰度优先级。分隔符> 例: 蓝光4M>蓝光>超清 蓝光4M优先级最高
retry 异常导致录制停止后的重试次数。默认5次
fileSize 分段录制的参考文件大小,0为不按文件大小分段,单位MB。默认0
filePeriod 分段录制的参考时长,0为不按时长分段,单位min。默认0
proxy 按需配置。http(s)代理 e.g. 127.0.0.1:8888
socksProxy 按需配置。socks代理 e.g. 127.0.0.1:1080
trustAllCert 是否无条件信任所有SSL证书。默认false
splitScriptTags 校准文件时是否分割ScriptTag。默认false
splitAVHeaderTags 校准文件时是否分割a/v header Tag时。默认与splitScriptTags一致
maxAudioHeaderSize 当Audio tag的data size小于该值时,认为是audio header。默认10
maxVideoHeaderSize 当Video tag的data size小于该值时,认为是video header。默认60
contentFramesToSkip 校验时,跳过前n个内容帧(即不是script、audio header、video header的帧)。默认0
maxPeriodBetween2Frame 在前10帧里,初始为0,后续如果某帧相比前一帧间隔过大,则选取该帧时间戳作为初始时间戳。默认5000,单位ms
fileName 文件命名规则,默认{name}-{shortId} 的{liver}直播{startTime}-{seq}
timeFormat 文件命名中{startTime}和{endTime}的格式,默认yyyy-MM-dd HH.mm
saveFolder 源文件保存路径
saveFolderAfterCheck FLV文件校准后的保存路径,check为true时有效。默认为空,此时与saveFolder等同
stopAfterOffline 当目标下播后,是否停止程序。为false时,需要和下面三个参数配合。默认true
retryIfLiveOff 当目标不在直播时,是否继续重试。默认false
maxRetryIfLiveOff 当目标不在直播时,继续重试的次数。默认0,此时会一直进行尝试,直到主播上线
retryAfterMinutes 当目标不在直播时,每次获取直播间信息的时间间隔,单位分钟。默认5.0
failRetryAfterMinutes 当连接出现异常时,下次尝试录制的时间间隔,单位分钟。默认1.0
plugin 插件功能,允许用户自定义某些操作。默认false
各直播源解析情况
liver 最后测试时间 备注
douyu 2023/02/22 flv清晰度可多选,但部分高清需要cookie
kuaishou 2023/02/22 flv清晰度可多选,必须要cookie(可以不登录,只需要过了拖拽验证即可)
douyin 2023/02/22 flv清晰度可多选,必须要cookie(可以不登录,只需要过了拖拽验证即可)。id为https://live.douyin.com/1234567后面的那串数字,也可以直接输入短网址类型https://v.douyin.com/xxxx
douyin2 2023/02/22 抖音的另一种解析方式,前者失败后可以尝试。flv清晰度可多选,必须要cookie(可以不登录,只需要过了拖拽验证即可)。id为https://live.douyin.com/1234567后面的那串数字,也可以直接输入短网址类型https://v.douyin.com/xxxx
yy 2022/10/09 flv清晰度可多选,必须要cookie(可以不登录,只需要过了拖拽验证即可)
huya 2023/02/22 flv清晰度可多选,可不需要cookie。开播后要过一阵才能检测到。部分视频时间戳校正后声音会变形,ffmpeg处理后正常
huya2 2023/02/22 虎牙的另一种解析方式,只接受数字id,非数字的需要打开网页寻找(热度值左边)。flv清晰度可多选,可不需要cookie。部分视频时间戳校正后声音会变形,ffmpeg处理后正常
acfun 2023/02/22 flv清晰度可多选,可不需要cookie
bili 2023/02/22 flv清晰度可多选,可不需要cookie
zhanqi 2019/06/30 flv清晰度可多选,可不需要cookie
huajiao 2019/06/02 flv只支持默认清晰度(似乎只有一种清晰度)
关于json配置
  • 如出现乱码,请尝试将charset设为不同的值,例如charset=GBK
  • 支持文件配置 + 参数字符串混用,此时直接传入的参数配置拥有更高优先级,例如
假设传入参数为: 
    options=D:\\Workspace\\config.json&liver=huya

对应的json文件为:
{
    "debug": false,
    "check": true,
    "delete": true,
    "zip": false,
    "liver": "bili",
    "retry": 5,
    "fileSize": 0,
    "filePeriod": 0,
    "splitScriptTags": false,
    "splitAVHeaderTags": false,
    "fileName": "{name}-{shortId} 的{liver}直播{startTime}-{seq}",
    "timeFormat": "yyyy-MM-dd HH.mm",
    "retryIfLiveOff": false,
    "maxRetryIfLiveOff": 0,
    "retryAfterMinutes": 5.0,
    "plugin": false,
    "stopAfterOffline": true
}

那么,此时生效的liver应该为: huya
校正某FLV文件的时间戳、分割solo/PK视频
  • java -Dfile.encoding=utf-8 -cp BiliLiveRecorder.jar nicelee.bilibili.live.check.FlvCheckerWithBufferEx "flv=源文件路径&debug=false&splitScripts=true&splitAVHeader=true&saveFolder=保存的文件夹路径"
Key 必选 释义
flv 源文件路径
debug debug模式,输出更多信息。默认true
splitScripts 当出现多个Script tag时,是否分割文件。默认false
splitAVHeaders 当出现多个a/v header时,是否分割文件。默认与splitScripts一致
contentFramesToSkip 校验时,跳过前n个内容帧(即不是script、audio header、video header的帧)。默认0
maxPeriodBetween2Frame 在前10帧里,初始为0,后续如果某帧相比前一帧间隔过大,则选取该帧时间戳作为初始时间戳。默认5000,单位ms
saveFolder 校准时间戳后的保存目录。默认与源文件相同目录
deleteOnchecked 校准后是否删除源文件,默认false
maxAudioHeaderSize 当Audio tag的data size小于该值时,认为是audio header。默认10
maxVideoHeaderSize 当Video tag的data size小于该值时,认为是video header。默认60
  • 旧版本的调用方法仍然兼容,但功能已经不再更新
  • 主播pk/更换设备/修改推流参数/旋转画面/网络不稳定时,可能出现许多异常情况。
    • splitScriptssplitAVHeaders参数就是针对这些异常采取的某些处理。
    • 当录制正常时,上面两个参数基本没有影响。
    • 注意:这些操作没法还原,所以理论上原始文件最保真。 不校验时间戳校验文件不分割 > 校验文件分割script/video header/audio header
解决视频开始时花屏的问题

尝试contentFramesToSkip=1甚至更高。
校验时,会跳过前contentFramesToSkip个内容帧(即不是script、audio header、video header的帧)。
可能需要配合参数maxAudioHeaderSizemaxVideoHeaderSize使用。

解决视频分割成多个文件后,分辨率不恰当的问题

主播单人直播和PK的分辨率不一样,使用splitScripts=true&splitAVHeaders=true/false可能出现很多只有KB大小的视频,以及大小正常的视频。 视频内容都在大小正常的视频里。
但是,某些大小正常的视频可能只有声音,或者分辨率不对。需要把该视频和前面的视频merge。

举例:  
...
kuaishou.xxx-abcd 的kuaishou直播2022-12-03 12.08-0-checked4.flv        76KB
kuaishou.xxx-abcd 的kuaishou直播2022-12-03 12.08-0-checked5.flv        81KB
kuaishou.xxx-abcd 的kuaishou直播2022-12-03 12.08-0-checked6.flv        473MB

假设checked6.flv分别率不对,可以merge checked5.flv + checked6.flv -> checked5.merge.flv
假设checked5.merge.flv分别率仍然不对,可以merge checked4.flv + checked5.merge.flv -> checked4.merge.flv
以此类推。  
如果还是不行,可以找到以前成功过的相同分辨率的几十KB的FLV作为头部,尝试与该视频merge。
  • java -Dfile.encoding=utf-8 -cp BiliLiveRecorder.jar nicelee.bilibili.live.check.FlvMerger "flv路径1" "flv路径2"
加载cookies(适用于高清晰度录制)
  • 将cookie保存到同级目录的{liver}-cookie.txt即可,e.g. douyu-cookie.txt
  • cookie内容为以下格式:
dy_did=xxx; acf_did=xxx; acf_auth=xxx; ...
  • 如何获取cookie(以斗鱼举例):
    • 打开浏览器,进入斗鱼直播
    • 登录账号(某些liver可以跳过)
    • 进入一个热度较高的直播间,选择清晰度: 蓝光10M(保险操作,如果清晰度不够试一试)
    • 按F12键
    • 过滤网址www.douyu.com
    • 任意选择一条记录,复制右边的cookie,如下图
关于Plugin
  • 写死的文件位置:plugin/CustomOperation.java
  • 可以新增import和自定义各种方法
  • 可以调用另外的库,这时需要java -jar换成 java -cp的形式,请善用搜索
  • 当Plugin文件发生变化时,请先删除运行时编译的class文件,否则不会生效
关于文件命名规则
  • 请勿传入非法字符,如&
  • 建议保留{startTime}{seq},以确保文件名唯一,否则很可能出现未知错误
  • 校准时间戳这一动作将会产生若干个文件,这些文件将在原来的基础上增加-checked[0-9]+后缀
  • 举例:
fileName={name}-{shortId} 的{liver}直播{startTime}-{seq}&filePeriod=20&check=false
那么,一个可能的结果是:
英雄联盟赛事-288016 的douyu直播 2019-09-19 17.40-0.flv
英雄联盟赛事-288016 的douyu直播 2019-09-19 18.00-1.flv

fileName={name}-{shortId} 的{liver}直播{startTime}-{seq}&filePeriod=20&check=true
增加时间戳校准动作。那么,一个可能的结果是:
英雄联盟赛事-288016 的douyu直播 2019-09-19 17.40-0-checked0.flv
英雄联盟赛事-288016 的douyu直播 2019-09-19 18.00-1-checked0.flv
Key 释义 支持saveFolder
name 主播名称
shortId 直播网址id
roomId 实际房间id,可能与shortId不同
liver 直播源,同传入参数
startTime 录制开始时间,精确到分,例如2019-11-19 20.18
endTime 录制开始时间,精确到分,例如2019-11-19 20.18
seq 录制产生的文件序号。从0开始;分段录制或异常重试均会使序号增大
关于清晰度规则(ver>=2.5.0)
  • qnqnPri可以同时存在,优先考虑qnPri,若匹配失败,再考虑传入的qn
可提供直播质量:
    0 : 超清
    2 : 高清
    1 : 流畅
传入参数: qn=2&qnPri=蓝光4M>蓝光
此时取 2 : 高清
-------------------------------
可提供直播质量:
    0 : 蓝光
    3 : 超清
    2 : 高清
    1 : 流畅
传入参数: qn=2&qnPri=蓝光4M>蓝光
此时取 0 : 蓝光
  • 当未传入qn,且(qnPri为空或不匹配),程序将提示输入qn值
可提供直播质量:
    0 : 超清
    2 : 高清
    1 : 流畅
传入参数: 不包含qn、qnPri   
or传入参数: qnPri=蓝光4M>蓝光
此时程序将提示输入qn值
  • 当指定qn生效(指qnPri为空或不匹配),且获取的清晰度列表不存在该清晰度值时,程序将退出
可提供直播质量:
    0 : 超清
    2 : 高清
    1 : 流畅
传入参数: qn=4
此时程序将退出
传入参数: qn=4&qnPri=蓝光4M>蓝光
此时程序将退出
关于获取 房间id

如下图:

运行截图

如下图:

😄其它

😄第三方库使用声明

😄LICENSE

Copyright (C) 2019-2023 NiceLee. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

More Repositories

1

BilibiliDown

(GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳
Java
1,456
star
2

LiveRecorder

you-live - A live recorder focus on China mainland livestream sites(A站/B站/斗鱼/快手)
Python
186
star
3

AcFunDown

包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 😳仅供交流学习使用喔
Java
59
star
4

PureHost

Java - Android - 免Root实现DNS指定 + Host功能的app. 不依赖第三方库
Java
39
star
5

GithubSoEasy

使用Cloudflare Workers代理加速Github,不仅仅是下载附件
Python
30
star
6

FaceSwap

基于opencv和dlib的视频换脸
Python
17
star
7

FileUploader4Github

pure java. GitHub文件上传工具,支持批量拖拽,可用于图床、批量上传等用途。仅需Java环境即可运行
Java
14
star
8

NinjaV4

我的百宝箱 - 微信计步作弊/远程监控家里WiFi/录制直播/QQ复读机器人/斗鱼日常养粉丝牌
Java
13
star
9

DanmuMusicPlayer

哔哩哔哩/斗鱼 弹幕点歌姬 - 支持QQ音乐/网易云音乐源
Java
10
star
10

FileEncrypter

基于Java的简单的文件加密器
Java
9
star
11

freedom4NG

端到端数据流量伪装加密研究(Android)
Java
9
star
12

ProxyHttpServer

基于Java 原生TCPSocket实现的小型Http/Https Proxy代理服务器Demo,能够代理http/https。
Java
8
star
13

vercel-serverless-python

A simple example for vercel serverless function written in python
Python
5
star
14

VideoSnipper

A Simple, Free Video Downloader; Mozilla FireFox Addons based on WebExtensions API.
JavaScript
5
star
15

Samples

Helloworld Samples
Java
4
star
16

BilibiliSuperLogin

java+selenium 实现B站账号密码自动登录并获取Cookies
Java
4
star
17

freedom4j

端到端数据流量伪装加密研究(java)
Java
3
star
18

proxy

A HTTPS/HTTP/SNI/SOCKS5 proxy demo written in Python
Python
3
star
19

MiraMira

[QQ机器人]mirai-console插件,支持网易云点歌、jrrp、回复闪照图片、动图添加文字
Java
3
star
20

MasterLee

一个tauri实现的本地 HTTP + SNI代理,能够智能查找可用的DNS over HTTPS服务, 为目标域名筛选最优IP [WIP]
Rust
3
star
21

ImAWriter

阅文作家助手 - 帮助作者从后台批量把自己书的章节下载到本地
Python
2
star
22

URLLogger

FireFox浏览器插件,通过配置的不同可以实现获取视频下载链接、监控可疑HTTP请求等功能
JavaScript
2
star
23

Notes

以往收集到的小Tips
HTML
2
star
24

NeighborFinder

一个局域网邻居发现app, 能够列出邻居IP/MAC, 支持备注
Java
2
star
25

nICEnnnnnnnLee.github.io

Index
HTML
2
star
26

FileHttpServer

基于Java 原生TCPSocket实现的小型服务器Demo,能够访问开放目录下的文件夹及文件内容,支持断点续传。
Java
2
star
27

rust-http-proxy-demo

Rust
2
star
28

freedom4py

端到端数据流量伪装加密研究(Python3)
Python
1
star
29

freedomGo

端到端数据流量伪装加密研究(Go)
Go
1
star
30

CaptureScreen

C# 截屏
C#
1
star
31

fontObfuscator

简单的字体混淆研究
Python
1
star
32

dns

A DNS server that uses DoH to find DNS. 😳 一个用DoH查找DNS的DNS服务器
Python
1
star
33

freedomRust

端到端数据流量伪装加密研究(Rust)
Rust
1
star