B站直播音频自动录制部署笔记背景

Skills · Server Automation

Record.
Watch.
Archive.

在 Ubuntu 24.04 部署长期运行的直播音频录制服务。

ScopeB站直播音频自动录制 ServerUbuntu 24.04 LTS RuntimePython venv / Streamlink / FFmpeg Updated2026-07-28
Mental model

这个服务不监听端口,只做轮询、拉流和保存。

Python 程序定时检查直播间状态。开播后用 Streamlink 拉取直播流,再交给 FFmpeg 只提取音频;下播或断流后,由主程序停止或重启录制。

Path

推荐部署顺序

  1. 安装 Python venv、FFmpeg 等系统依赖。
  2. 创建专用系统用户 bili-recorder
  3. 创建程序目录、录音目录和日志目录。
  4. 在 venv 中安装 streamlinkrequests
  5. 上传 Python 程序到 /opt/bili-recorder/bili_recorder.py
  6. 创建 config.json,填入直播间 ID 和 UP 名称。
  7. 手动运行一次,确认程序能启动。
  8. 创建 systemd 服务并设置开机自启。
Why venv

不要污染系统 Python

Ubuntu 24.04 对系统 Python 包管理更严格。用虚拟环境安装 Streamlink 和 requests,可以避免 --break-system-packages 带来的维护问题。

Why user

不要用 root 常驻跑录制

专用用户只需要写入程序目录、日志目录和录音目录。服务即使异常,也不会拥有不必要的系统权限。

Checklist

上线前检查表

项目 路径或命令 通过标准
程序文件 /opt/bili-recorder/bili_recorder.py 属于 bili-recorder 用户,并可执行。
配置文件 /opt/bili-recorder/config.json JSON 合法,至少有一个直播间。
录音目录 /data/bili-audio bili-recorder 用户可写。
日志目录 /var/log/bili-recorder 能生成 recorder.log
后台服务 systemctl status bili-recorder 状态为 active (running)
Dependencies

先判断当前终端,再安装依赖

Run as root on Ubuntu
hostname
apt update
apt install -y sudo nano python3 python3-venv ffmpeg

提示符为 root@服务器:~# 时已经是 root,不需要在 apt 前加 sudo。提示符为 rda@iMac ~ % 时仍在 macOS,本机没有 apt,要先 SSH 登录服务器。

User

创建专用系统用户

User and shell
sudo useradd --system --home /opt/bili-recorder --shell /usr/sbin/nologin bili-recorder

这个用户只用于运行服务,不需要能直接登录服务器。

如果 sudo 提示 unable to resolve host,确认 /etc/hosts 含有 127.0.1.1 当前主机名。这个警告通常不阻止命令执行,但应先修复再继续。

Folders

创建程序、录音和日志目录

Directory ownership
sudo mkdir -p /opt/bili-recorder
sudo mkdir -p /data/bili-audio
sudo mkdir -p /var/log/bili-recorder

sudo chown -R bili-recorder:bili-recorder /opt/bili-recorder
sudo chown -R bili-recorder:bili-recorder /data/bili-audio
sudo chown -R bili-recorder:bili-recorder /var/log/bili-recorder

如果你希望录音保存在其他磁盘,把 /data/bili-audio 换成对应挂载路径,并确认该路径不会因为重启丢失。

Virtual environment

创建 venv、安装依赖并确认命令路径

Python packages
sudo -u bili-recorder python3 -m venv /opt/bili-recorder/venv
sudo -u bili-recorder /opt/bili-recorder/venv/bin/pip install -U pip
sudo -u bili-recorder /opt/bili-recorder/venv/bin/pip install streamlink requests

sudo -u bili-recorder /opt/bili-recorder/venv/bin/streamlink --version
/usr/bin/ffmpeg -version | head -1

Streamlink 安装在 /opt/bili-recorder/venv/bin,不会自动成为系统全局命令。后面的手动测试和 systemd 服务必须显式包含这个目录,否则程序虽然能发现开播,却会因为找不到 streamlink 而无法创建录音文件。

Target path

先确认服务器上的目标位置

Run on server
sudo mkdir -p /opt/bili-recorder
sudo chown bili-recorder:bili-recorder /opt/bili-recorder

程序最终要放在 /opt/bili-recorder/bili_recorder.py。先保证这个目录已经存在,并且属于 bili-recorder 用户。

Manual upload

从 iMac 上传正确的程序与配置

下面的 scp 必须在显示 rda@iMac 的本机 Terminal 执行,不能在 root@服务器 中执行。把目标地址替换成实际服务器 IP。

Run on iMac
scp \
  "$HOME/Desktop/Server/Features/直播录音/bili_recorder.py" \
  "$HOME/Desktop/Server/Features/直播录音/config.json" \
  root@服务器IP:/opt/bili-recorder/

不要上传 Features/bili-monitor/bili_recordor.py。那是要求 up_list、由 cron 调度的另一套程序,不适用于本页的 systemd 服务。

Permissions

给程序文件设置权限

Run on server
sudo chown bili-recorder:bili-recorder /opt/bili-recorder/bili_recorder.py
sudo chown bili-recorder:bili-recorder /opt/bili-recorder/config.json
sudo chmod 750 /opt/bili-recorder/bili_recorder.py
sudo chmod 640 /opt/bili-recorder/config.json
Verify file

确认上传的是正确版本,再检查语法

Syntax check
wc -c /opt/bili-recorder/bili_recorder.py
grep -n 'CONFIG_PATH' /opt/bili-recorder/bili_recorder.py
sudo -u bili-recorder /opt/bili-recorder/venv/bin/python -m py_compile /opt/bili-recorder/bili_recorder.py

当前正确脚本约为 9605 字节,并应显示 CONFIG_PATH = "/opt/bili-recorder/config.json"。如果文件约为 14938 字节或运行后报缺少 up_list,说明上传了错误的 bili-monitor 脚本。语法检查没有输出即为通过。

config.json

写入直播间配置

Create config
sudo nano /opt/bili-recorder/config.json
/opt/bili-recorder/config.json
{
  "save_dir": "/data/bili-audio",
  "check_interval": 60,
  "request_timeout": 10,
  "max_workers": 4,
  "audio_format": "mp3",
  "quality": "best",
  "rooms": [
    {
      "room_id": "123456",
      "up_name": "某个UP"
    }
  ]
}
Permissions
sudo chown bili-recorder:bili-recorder /opt/bili-recorder/config.json
sudo chmod 640 /opt/bili-recorder/config.json
Fields

关键字段

字段 说明
save_dir 录音保存目录。
check_interval 检查直播状态的间隔,单位秒。
audio_format 支持 m4amp3。需要通用回放时可用 mp3;更看重相同码率下的音质和体积时可保留 m4a
rooms 要监控的直播间列表。
More rooms

添加多个直播间

rooms array
"rooms": [
  {
    "room_id": "123456",
    "up_name": "某个UP"
  },
  {
    "room_id": "654321",
    "up_name": "另一个UP"
  }
]

up_name 用于文件夹和文件名,不一定要和 B站昵称完全一致。

MP3 output

确认编码器并切换为 MP3

Encoder and config
ffmpeg -hide_banner -encoders | grep libmp3lame

sed -i 's/"audio_format": "m4a"/"audio_format": "mp3"/' \
  /opt/bili-recorder/config.json

sudo -u bili-recorder \
  /opt/bili-recorder/venv/bin/python \
  -m json.tool /opt/bili-recorder/config.json >/dev/null \
  && echo "config OK"

编码器列表出现 libmp3lame 且配置检查输出 config OK,即可使用 MP3。服务已经运行时,再执行 sudo systemctl restart bili-recorder,并在日志中确认 [CONFIG] 音频格式:mp3。已有 M4A 文件不会自动转换。

Convert an existing M4A
ffmpeg -i input.m4a -vn -c:a libmp3lame -b:a 128k output.mp3

转换已有文件会重新编码并产生少量音质损失;只为自己回听时,也可以保留原始 M4A。

Manual test

用和后台服务相同的 PATH 手动启动

Run as service user
sudo -u bili-recorder env \
  PATH=/opt/bili-recorder/venv/bin:/usr/local/bin:/usr/bin:/bin \
  /opt/bili-recorder/venv/bin/python \
  /opt/bili-recorder/bili_recorder.py

看到 [INIT][WAIT] 说明程序已启动。如果此时有监控对象开播,还应看到 [START],并在保存目录内出现音频文件。测试完成后按 Ctrl+C 退出,再交给 systemd 常驻运行。

Unit file

创建服务文件

Create unit
sudo nano /etc/systemd/system/bili-recorder.service
/etc/systemd/system/bili-recorder.service
[Unit]
Description=Bilibili Live Audio Recorder
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=bili-recorder
Group=bili-recorder
WorkingDirectory=/opt/bili-recorder
Environment="PATH=/opt/bili-recorder/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
ExecStart=/opt/bili-recorder/venv/bin/python /opt/bili-recorder/bili_recorder.py
Restart=always
RestartSec=10
KillSignal=SIGTERM
TimeoutStopSec=30
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Environment 这一行不能省略。使用 venv 中的 Python 启动脚本,并不会自动让脚本创建的子进程找到 venv 中的 Streamlink。

Start

启动并设置开机自启

Enable service
sudo systemctl daemon-reload
sudo systemctl enable bili-recorder
sudo systemctl start bili-recorder
Status

查看服务状态

Service status
sudo systemctl status bili-recorder --no-pager
sudo systemctl show bili-recorder -p Environment
sudo tail -n 50 /var/log/bili-recorder/recorder.log

服务应显示 active (running),环境变量输出应包含 PATH=/opt/bili-recorder/venv/bin:...,日志中应出现新的 [INIT][WAIT]。之后服务器重启,服务也会自动恢复。

Logs

查看实时日志

Journal
journalctl -u bili-recorder -f
File log
sudo tail -f /var/log/bili-recorder/recorder.log
Control

常用管理命令

systemctl
sudo systemctl restart bili-recorder
sudo systemctl stop bili-recorder
sudo systemctl start bili-recorder
sudo systemctl status bili-recorder
Output

录音保存位置

Directory shape
/data/bili-audio/
└── 某个UP/
    └── 2026-07-28/
        └── 2026-07-28_22-30-01_某个UP_123456_直播标题.mp3
Troubleshooting

定期确认整条录制链路

Health check
sudo systemctl status bili-recorder --no-pager
sudo systemctl show bili-recorder -p Environment
sudo -u bili-recorder /opt/bili-recorder/venv/bin/streamlink --version
/usr/bin/ffmpeg -version | head -1
sudo -u bili-recorder test -w /data/bili-audio && echo writable
sudo tail -n 100 /var/log/bili-recorder/recorder.log
find /data/bili-audio -type f -size +0 -ls | tail

创建出 UP 主和日期目录,只能证明开播检测成功;必须看到大于零字节的音频文件,才能确认 Streamlink 拉流和 FFmpeg 转码都在工作。

Known errors

常见报错与对应修复

报错或现象 原因 处理方式
sudo: command not found 精简系统未安装 sudo,且当前通常已经是 root。 直接执行 apt install -y sudo;root 执行系统命令时也可暂时去掉 sudo。
apt: command not found 命令误在 iMac 的 macOS Terminal 中执行。 先 SSH 登录服务器,确认提示符为 root@服务器:~# 后再运行 apt。
nano: command not found 精简系统没有预装文本编辑器。 以 root 执行 apt install -y nano,或改用已有的 vi。
unable to resolve host 当前主机名没有映射到 /etc/hosts 在 hosts 中加入 127.0.1.1 当前主机名,再用 getent hosts "$(hostname)" 验证。
No such file or directory 在上传程序之前就执行了 chown、chmod 或语法检查。 先从 iMac 使用 scp 上传文件,再回服务器设置权限。
venv/bin/python: command not found 尚未创建 Python 虚拟环境。 安装 python3-venv,再以 bili-recorder 用户运行 python3 -m venv /opt/bili-recorder/venv
config.json 中没有 up_list 误上传了 bili-monitor/bili_recordor.py,它与本页的 rooms 配置不兼容。 换回“直播录音”目录中约 9605 字节的 bili_recorder.py
识别开播并创建目录,但目录为空 systemd 能运行 Python,却没有在 PATH 中找到 venv 内的 Streamlink。 保留服务文件中的 Environment="PATH=/opt/bili-recorder/venv/bin:...",重新加载并重启服务。
scp: stat local ... No such file 把只存在于 iMac 的 /Users/... 路径放在服务器上执行。 在显示 rda@iMac 的本机标签页执行 scp,并把“服务器IP”替换为真实地址。
收到信号 2收到信号 15 分别来自手动按 Ctrl+C 和 systemd 重启旧进程。 属于正常退出;继续确认重启后出现新的 [INIT] 日志。
RemoteDisconnected B站接口或网络连接临时中断。 单次出现可等待下一轮自动重试;若持续出现,再检查服务器网络和接口访问。
Notes

长期运行要注意

  • B站接口和 Streamlink 插件规则可能变化,后续如果突然无法拉流,先升级 Streamlink。
  • 长时间录制会持续占用磁盘,建议定期清理旧文件或同步到对象存储。
  • 如果某些直播间需要登录态、风控验证或区域限制,可能需要额外配置 cookies。
  • 录制直播内容可能涉及平台规则、版权和主播授权,正式使用前应确认使用场景合规。