前言

本文主要介绍olive。

使用

我的使用思路很简单, 如下:

  • 从源码直接运行(不做打包处理)。 通过hyper-v自启动的linux虚拟机中的Systemd模块配合.sh脚本来自启动这个项目。

  • 并且olive支持自动监控直播间是否开播。

    也就是说, 如果只录制自己直播间的话, 我肯定是在电脑启动后开播的, 而电脑启动后olive也就自启动了(即开始实时监测直播间是否开播), 当我准备就绪开播时, 就会触发olive的监测, 以自动开始录制这场直播。

  • 还有就是, 对于b站的用户, 还支持将录制视频自动上传b站。(这样相当于节省本地存储, 白嫖b站的存储空间)

  • 最后还需要定期删除已上传的视频文件, 以节省本地存储空间

    这一步在我看来也是很重要的, 特别是如果部署到一个存储空间很小的服务器时, 定期删除很重要。(不过我是在本地使用的, 需求可能没那么强烈, 但也需要)

    只是目前为止貌似在此项目中还未实现(我也是今天才用这个项目, 也许已经实现了我每找到用法。 即使目前真的没实现, 也可以自己写相关脚本来做, 并不影响使用)
    配置中有这一操作

    olive 内部提供了几个已经实现好开箱即用的命令( 在[[Shows]] 的PostCmds中增加 Path 配置项 )

    • olivearchive: 将文件移动到当前路径下的 archive 文件夹中。
    • olivetrash: 将文件删除(不可恢复)。
    • olivebiliup: 若有配置 CookieFilepath、BiliupEnable,则会根据配置自动上传至哔哩哔哩,若上传失败会执行olivearchive
    • oliveshell: 将常规终端指令切分成字符串数组,并配置到 Args 中。
      olive 内置了文件路径作为环境变量,并可以通过 $FILE_PATH 获取。注意环境变量只有在 shell 环境中才会正确解析,如 /bin/zsh -c “echo $FILE_PATH” ,只执行 echo $FILE_PATH 则很可能获取不到路径信息。

      PostCmds = '[{"Path":"oliveshell","Args":["/bin/zsh","-c","echo $FILE_PATH"]},{"Path":"olivebiliup"},{"Path":"olivetrash"}]'
      也就是说, olivebiliup上传命令执行后(注意需要在命令行中执行olive biliup login来了登录获取cookies, 并配置cookies文件路径至 CookieFilepath, 然后配置BiliupEnable为true状态), 会执行olivetrash删除原文件(即使执行失败)。 但是就算执行失败也不会造成源文件丢失, 因为执行失败后会优先执行olivearchive将文件移动到当前路径下的 archive 文件夹中。

至于olive的使用, 其文档已经很详细了, 这里就不在本文过多介绍, 仅附上文档地址https://go-olive.github.io/docs/guide/intro/, 不过我是项自己从源码运行, 而不是使用通过install直接构建好的。

那么, 就简单记录下从源码执行的过程吧(文档中没写这部分, 因此这里简单说明下):

  • 虚拟机创建
  • 在新的linux系统中安装go语言, 并配置好(包括代理) 参考链接
  • 从olive项目地址clone源码
  • cd进入源码目录, 通过 go mode download 下载全部项目依赖
  • 使用 go run main.go 运行此项目
  • go run main.go 即相当于文档中的 olive 命令
    • olive help 就是 go run main.go help
    • 和上个例子一样, 再举个例子 olive run -u https://www.huya.com/518512 就是 go run main.go run https://www.huya.com/518512
  • 编辑 olive 的配置文件, 通过配置文件运行, 以使用其自动上传功能。
  • 编写 .sh 脚本
  • 使用 system 自启动 .sh 脚本

以上就是具体过程了。

olive的配置文件

更推荐使用 配置文件 方式执行它(即go run main.go run -f /home/srackhall/desktop/srackhall直播间录制目录/config.tomlolive run -f /home/srackhall/desktop/srackhall直播间录制目录/config.toml), 以便使用自动上传以及自定义录制后所执行命令的功能, 下面附上我的配置文件(其中有详细的解释说明):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
[Config]
PortalUsername = 'olive'
PortalPassword = 'olive'
# 日志输出目录
LogDir = '/home/srackhall/desktop/srackhall直播间录制目录/oliveLog'
# 全局 OutTmpl
OutTmpl = "[{{ .SiteName }}][{{ now | date \"2006-01-02 15-04-05\"}}][{{ .RoomName }}][{{ .StreamerName }}]"
# 全局 SaveDir,绝对路径
SaveDir = "/home/srackhall/desktop/srackhall直播间录制目录/olive/{{ .SiteName }}/{{ .StreamerName }}/"

# 日志等级 (0~6), 越大日志输出越多
LogLevel = 5
# 直播间状态查询间隔时间(秒)
SnapRestSeconds = 15
# 文件是否满足切割条件检测间隔时间(秒)
SplitRestSeconds = 60
# 直播间录播结束后执行命令的并发执行的个数
CommanderPoolSize = 1
# 解析器工作状态检查间隔时间(秒)
ParserMonitorRestSeconds = 10

# 部分网站需要配置 cookie
DouyinCookie = "__ac_nonce=06245c89100e7ab2dd536; __ac_signature=_02B4Z6wo00f01LjBMSAAAIDBwA.aJ.c4z1C44TWAAEx696;"
KuaishouCookie = "did=web_d86297aa2f579589b8abc2594b0ea985"

# biliup 配置项
# 开启biliup (biliup主要是用来自动上传b站的, 当然, 这个配置项可以让我们在录制结束后自定义一些shell脚本的命令, 比如上传网盘等, 推荐使用zsh, zsh比bash更优秀)
BiliupEnable = true
# cookies 文件路径 cookies 文件生成可在命令行执行 `olive biliup login` 命令(登录后cookies 文件会在当前目录生成, 可自行将生成的cookies 文件其移动到自定义路径, 然后书写此配置)
CookieFilepath = '/home/srackhall/desktop/srackhall直播间录制目录/cookies.json'
Threads = 6
# 每秒最多上传字节数,以下配置是限速 2MB/s
MaxBytesPerSecond = 2097152

# [[Shows]]
# # 全局唯一字符串,因为配置修改会实时监控实时更新,故以此 ID 作为标识这一个录制的配置项
# ID = 'a'
# # 平台名称 (更多的一些网站被 streamlink 支持,所以就没有必要重新造轮子了, streamlink 可以作为一个插件在 olive 中使用 。只要网站在 streamlink 中被支持。通常用于一些非主流平台(有的主流平台也是支持的)(streamlink开源免费还是BSD许可-自由定制修改分发代码也是被允许的)。)
# Platform = "huya"
# # 房间号 (若使用独立的streamlink-在olive中被作为插件 , 这里通常是url链接)
# RoomID = "518512"

[[Shows]]
# # 全局唯一字符串,因为配置修改会实时监控实时更新,故以此 ID 作为标识这一个录制的配置项(可以尽可能最小范围地更新或者刷新配置, 以免影响其它无需更改的配置项-因为它们可能正在执行录制-此时刷新其配置可能会影响录制--个人猜测, 没看源码, 不过应该八九不离十)
ID = 'b'
# 这个 Enable 在此项目的网页端使用的, 终端用户无需管它
Enable = false
# # 平台名称 (更多的一些网站被 streamlink 支持,所以就没有必要重新造轮子了, streamlink 可以作为一个插件在 olive 中使用 。只要网站在 streamlink 中被支持。通常用于一些非主流平台(有的主流平台也是支持的)(streamlink开源免费还是BSD许可-自由定制修改分发代码也是被允许的)。)
Platform = 'bilibili'
# # 房间号 (若使用独立的streamlink-在olive中被作为插件 , 这里通常是url链接)
RoomID = '22810558'
StreamerName = 'srackhall' # 主播名称需要自己定义
# # 日期: {{ now | date \"2006-01-02 15-04-05\"}}
# # 主播名称: {{ .StreamerName }}
# # 直播标题: {{ .RoomName }}
# # 直播平台: {{ .SiteName }}
OutTmpl = "[{{ .SiteName }}][{{ now | date \"2006-01-02 15-04-05\"}}][{{ .RoomName }}][{{ .StreamerName }}]"
# OutTmpl = '[{{ .StreamerName }}][{{ .RoomName }}][{{ now | date "2006-01-02 15-04-05"}}].flv'
Parser = 'flv' # 此下载器olive已内置
SaveDir = '/home/srackhall/desktop/srackhall直播间录制目录/olive/{{ .SiteName }}/{{ .StreamerName }}/'
# /bin/zsh 在有的Linux发行版中是没有的, 故可能需要手动安装(zsh 比 bash 更好用--比如zsh相比普通sh对文件名中有空格的情况支持会更好)
# # "/bin/zsh","-c", 是建议加上的。(/bin/zsh -c "echo $FILE_PATH" 中的 -c 是一个非常有用的选项,它允许你在启动 Zsh 的同时执行一个命令 )
# # 每个 {"Path":"olivebiliup"} 大括号都是一个单独的cmd, 用'逗号'隔开, 只有在执行成功时, 才会执行下一个大括号中的cmd。因此自定义命令的话, 推荐写多个{"Path":"oliveshell","Args":["/bin/zsh","-c","echo $FILE_PATH"]}这种cmd配置。
# # 比如目前改不了格式(默认就是.flv的视频文件),需要自己转封装。也就是说自己转换格式时, 就可以利用这里的自定义命令来自行封装(当然得配合一些带终端命令的格式转换工具--相关的开源项目就可以选择使用就是最强的那个就不过多描述了)
PostCmds = '[{"Path":"oliveshell","Args":["/bin/zsh","-c","echo $FILE_PATH"]},{"Path":"olivebiliup"},{"Path":"olivetrash"}]'
# 文件切分的配置 最大视频大小(字节): FileSize 最大视频时长: Duration
SplitRule = '{"FileSize":6000000000,"Duration":"3h"}'

tips:

  • 我来解释下图的error, 首先可以确定的是, 不会影响正常录制和上传任务。 cnt应该是count的缩写, 也就是说这前3行报错实质上就是一个心跳检测, 用来确定直播是否真的结束了, 以便之后重新开启下阶段的循环检测。 但第4行的错误我确实猜不出来其目的了(懒得看源代码了), 可能与网页端有关吧, 或者可能和循环检测前的处理有关, 总之我也不知道哈哈(但其也是不影响自动录制和自动上传的)。
  • 可以利用’全局 SaveDir,绝对路径’ 和 ‘全局 OutTmpl’来简化 并行录制多个直播间时的配置量, 在对应[[Shows]]中对应的配置项使用’’或干脆不写就行(当然, 也可对需要个性化或者比较重要的对应配置项单独配置-优先与全局生效)。
  • 在添加新直播间录制任务时, 请避免对配置文件中的’全局配置’以及’全局唯一字符串不同的对应配置’做改动, 确保做到仅修改新增直播间录制任务的所需配置(以确保已有的正在运行的录制任务不受影响)。也就是说, 同时录制多个直播间时, 是没必要运行多个olive进程的。