这个服务不监听端口,只做轮询、拉流和保存。
Python 程序定时检查直播间状态。开播后用 Streamlink 拉取直播流,再交给 FFmpeg 只提取音频;下播或断流后,由主程序停止或重启录制。
Skills · Server Automation
在 Ubuntu 24.04 部署长期运行的直播音频录制服务。
Python 程序定时检查直播间状态。开播后用 Streamlink 拉取直播流,再交给 FFmpeg 只提取音频;下播或断流后,由主程序停止或重启录制。
bili-recorder。streamlink 和 requests。/opt/bili-recorder/bili_recorder.py。config.json,填入直播间 ID 和 UP 名称。
Ubuntu 24.04 对系统 Python 包管理更严格。用虚拟环境安装 Streamlink 和 requests,可以避免 --break-system-packages 带来的维护问题。
专用用户只需要写入程序目录、日志目录和录音目录。服务即使异常,也不会拥有不必要的系统权限。
| 项目 | 路径或命令 | 通过标准 |
|---|---|---|
| 程序文件 | /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)。 |
sudo apt update
sudo apt install -y python3 python3-venv ffmpeg
ffmpeg 负责把直播流转换成音频文件;Python 依赖放到 venv 里安装。
sudo useradd --system --home /opt/bili-recorder --shell /usr/sbin/nologin bili-recorder
这个用户只用于运行服务,不需要能直接登录服务器。
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 换成对应挂载路径,并确认该路径不会因为重启丢失。
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 而无法创建录音文件。
sudo mkdir -p /opt/bili-recorder
sudo chown bili-recorder:bili-recorder /opt/bili-recorder
程序最终要放在 /opt/bili-recorder/bili_recorder.py。先保证这个目录已经存在,并且属于 bili-recorder 用户。
在你的电脑上找到 bili_recorder_optimized.py,用服务器面板文件管理器、SFTP 工具、VS Code Remote-SSH,或其他你习惯的上传方式,把它放到服务器:
/opt/bili-recorder/bili_recorder.py
注意文件名要改成 bili_recorder.py,不是 bili_recorder_optimized.py。放好后再继续下面的授权步骤。
sudo chown bili-recorder:bili-recorder /opt/bili-recorder/bili_recorder.py
sudo chmod +x /opt/bili-recorder/bili_recorder.py
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 解析。
sudo nano /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"
}
]
}
sudo chown bili-recorder:bili-recorder /opt/bili-recorder/config.json
sudo chmod 640 /opt/bili-recorder/config.json
| 字段 | 说明 |
|---|---|
save_dir |
录音保存目录。 |
check_interval |
检查直播状态的间隔,单位秒。 |
audio_format |
支持 m4a 或 mp3,推荐 m4a。 |
rooms |
要监控的直播间列表。 |
"rooms": [
{
"room_id": "123456",
"up_name": "某个UP"
},
{
"room_id": "654321",
"up_name": "另一个UP"
}
]
up_name 用于文件夹和文件名,不一定要和 B站昵称完全一致。
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 常驻运行。
sudo nano /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。
sudo systemctl daemon-reload
sudo systemctl enable bili-recorder
sudo systemctl start bili-recorder
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]。之后服务器重启,服务也会自动恢复。
journalctl -u bili-recorder -f
sudo tail -f /var/log/bili-recorder/recorder.log
sudo systemctl restart bili-recorder
sudo systemctl stop bili-recorder
sudo systemctl start bili-recorder
sudo systemctl status bili-recorder
/data/bili-audio/
└── 某个UP/
└── 2026-07-04/
└── 2026-07-04_22-30-01_某个UP_123456_直播标题.m4a
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 转码都在工作。