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

Skills · Server Automation

Record.
Watch.
Archive.

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

Ubuntu 24.04
Python · systemd

ScopeB站直播音频自动录制 ServerUbuntu 24.04 LTS RuntimePython venv / Streamlink / FFmpeg Updated2026-07-22
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

安装系统依赖

Ubuntu 24.04
sudo apt update
sudo apt install -y python3 python3-venv ffmpeg

ffmpeg 负责把直播流转换成音频文件;Python 依赖放到 venv 里安装。

User

创建专用系统用户

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

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

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

手动把程序文件放进去

在你的电脑上找到 bili_recorder_optimized.py,用服务器面板文件管理器、SFTP 工具、VS Code Remote-SSH,或其他你习惯的上传方式,把它放到服务器:

Final file path
/opt/bili-recorder/bili_recorder.py

注意文件名要改成 bili_recorder.py,不是 bili_recorder_optimized.py。放好后再继续下面的授权步骤。

Permissions

给程序文件设置权限

Run on server
sudo chown bili-recorder:bili-recorder /opt/bili-recorder/bili_recorder.py
sudo chmod +x /opt/bili-recorder/bili_recorder.py
Verify file

确认文件存在并检查语法

Syntax check
ls -l /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

语法检查没有输出,通常就是通过。这里还不会开始录制,只是确认程序文件本身能被 Python 解析。

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": "m4a",
  "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,推荐 m4a
rooms 要监控的直播间列表。
More rooms

添加多个直播间

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

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

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-04/
        └── 2026-07-04_22-30-01_某个UP_123456_直播标题.m4a
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 转码都在工作。

Notes

长期运行要注意

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