(原) B站视频转私人电台部署教程

原创文章,请后转载,并注明出处。

说明

适用系统:Ubuntu / Debian / WSL2 技术栈:yt-dlp + FFmpeg + Icecast2 功能:B站视频音频实时转私有电台,局域网手机、电脑VLC均可收听,全程无本地音视频缓存

目录

  1. 整体方案原理
  2. 全套环境安装
  3. Icecast2 流媒体服务配置
  4. B站登录Cookie导出(解锁会员视频)
  5. 稳定推流完整执行命令
  6. 多设备收听方法
  7. 进阶:后台常驻运行(关闭终端不断流)
  8. 高频故障排查汇总

1. 整体方案原理

数据流链路

B站视频音频源 → yt-dlp管道实时抓取 → FFmpeg统一转码MP3 → Icecast2流媒体服务 → VLC播放器播放

组件分工

  1. Icecast2:音频流服务端,监听8000端口,支持多路音频流、多设备同时连接收听
  2. yt-dlp:解析B站音频资源,携带浏览器头部、Cookie绕过防盗链与会员限制
  3. FFmpeg:统一转码为通用立体声MP3,使用icecast://专用协议推流,解决http协议兼容性报错

2. 全套环境安装

2.1 更新系统源

sudo apt update && sudo apt upgrade -y

2.2 一键安装所有依赖

# 流媒体服务、音视频处理工具
sudo apt install -y icecast2 ffmpeg python3 python3-pip
# 安装B站资源解析工具
pip3 install yt-dlp

2.3 环境校验(确认安装成功)

ffmpeg -version
yt-dlp --version
icecast2 -v

终端正常输出版本号即代表环境就绪。


3. Icecast2 流媒体服务配置

3.1 编辑配置文件

sudo nano /etc/icecast2/icecast.xml

删除原有全部内容,粘贴以下最简可用配置:

<icecast>
<limits>
    <clients>100</clients>
    <sources>10</sources>
    <queue-size>524288</queue-size>
</limits>

<listen-socket>
    <port>8000</port>
    <!-- 0.0.0.0 = 局域网所有设备可访问;127.0.0.1 = 仅本机访问 -->
    <bind-address>0.0.0.0</bind-address>
</listen-socket>

<authentication>
    <!-- 推流密码,推流命令必须和此处保持一致 -->
    <source-password>123123</source-password>
    <relay-password>123123</relay-password>
    <!-- 网页后台管理账号密码 -->
    <admin-user>admin</admin-user>
    <admin-password>123123</admin-password>
</authentication>
</icecast>

保存退出快捷键:Ctrl+O → 回车确认 → Ctrl+X

3.2 修复文件权限(解决 Permission denied 报错)

# 配置文件权限修正
sudo chown icecast2:icecast /etc/icecast2/icecast.xml
sudo chmod 600 /etc/icecast2/icecast.xml
# 日志目录权限修正
sudo chown -R icecast2:icecast /var/log/icecast2
sudo chmod 700 /var/log/icecast2

3.3 启动服务并设置开机自启

# 重载系统服务配置
sudo systemctl daemon-reload
# 启动电台服务
sudo systemctl start icecast2
# 设置开机自动运行
sudo systemctl enable icecast2
# 查看运行状态
systemctl status icecast2

输出active (running)代表服务正常运行。

3.4 实时监控电台连接日志(新开终端常驻)

journalctl -u icecast2 -f

推流成功时会打印日志:Source connected from xxx.xxx.xxx.xxx

3.5 验证服务网页

浏览器访问(替换为你的服务器内网 IP)

http://100.84.113.50:8000

页面显示No mounts! There are no active mountpoints.为正常,代表暂无音频流接入。


作用:解锁大会员、地区限制视频,规避 403 无权限抓取报错

  1. Chrome / Edge 浏览器安装扩展:Get cookies.txt LOCALLY

  2. 浏览器登录 B 站账号(有大会员请登录会员账号)

  3. 打开任意 B 站视频页面,点击扩展,导出Netscape 格式Cookie 文件

  4. 将导出文件重命名为cookies.txt,放到执行推流命令的同级文件夹

Cookie 有效期约 30 天,失效后重新导出覆盖文件即可。


5. 完整 B 站音频转电台推流命令

可直接复制完整脚本

yt-dlp --sleep-requests 1.0 \
--user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/126.0.0.0 Safari/537.36" \
--add-header "Referer:https://www.bilibili.com/" \
--add-header "Origin:https://www.bilibili.com" \
--add-header "Accept-Language:zh-CN,zh;q=0.9" \
--cookies ./cookies.txt -f bestaudio -o - "https://www.bilibili.com/video/BV1JuJg61Erz" \
| ffmpeg -re -i pipe:0 -vn -c:a libmp3lame -b:a 128k -ar 44100 -ac 2 \
-metadata ice_name="B站私人电台" -f mp3 icecast://source:123123@127.0.0.1:8000/bili

参数分段说明

yt-dlp 抓取段(B 站防盗链适配)

  • --sleep-requests 1.0:请求间隔 1 秒,防止 B 站风控封禁 IP

  • UA/Referer/Origin:模拟浏览器访问,绕过 B 站防盗链限制

  • --cookies ./cookies.txt:登录凭证,解锁会员视频

  • -f bestaudio -o -:仅抓取最高音质音频,管道输出,不保存本地文件

FFmpeg 转码推流段(核心修复)

  • -re:按原音频实时速度输出,避免倍速播放

  • -vn:丢弃视频画面,仅保留音频

  • -c:a libmp3lame -b:a 128k -ar 44100 -ac 2:标准立体声 MP3 参数,全播放器兼容

  • -metadata ice_name:自定义电台名称,Icecast 网页后台展示

  • icecast://source:密码@127.0.0.1:8000/bili:Icecast 官方专用推流协议,修复 http 协议格式报错

  • /bili:流挂载点,修改名称可实现多频道同时推流


6. 多设备收听方式

6.1 本机收听

http://127.0.0.1:8000/bili.m3u

6.2 局域网手机 / 其他电脑收听

http://100.84.113.50:8000/bili.m3u

播放操作

打开 VLC 播放器 → 媒体 → 打开网络串流 → 粘贴链接即可播放。

查看电台在线流状态

http://100.84.113.50:8000/status.xsl

页面出现 /bilibili-stream 挂载点代表推流正常。


7. 进阶:后台常驻运行(关闭终端不中断电台)

使用 nohup 将推流进程后台挂起,关闭终端音频不会中断:

nohup yt-dlp --sleep-requests 1.0 \
--user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/126.0.0.0 Safari/537.36" \
--add-header "Referer:https://www.bilibili.com/" \
--add-header "Origin:https://www.bilibili.com" \
--add-header "Accept-Language:zh-CN,zh;q=0.9" \
--cookies ./cookies.txt -f bestaudio -o - "https://www.bilibili.com/video/BV1JuJg61Erz" \
| ffmpeg -re -i pipe:0 -vn -c:a libmp3lame -b:a 128k -ar 44100 -ac 2 \
-metadata ice_name="B站私人电台" -f mp3 icecast://source:123123@127.0.0.1:8000/bili > radio.log 2>&1 &

配套管理命令

  1. 查看后台推流进程
ps aux | grep ffmpeg
  1. 停止电台流(数字替换为进程 PID)
kill 12345
  1. 查看推流日志
cat radio.log

带宽优化

降低音频码率节省局域网带宽,将 -b:a 128k 修改为 -b:a 96k


8. 常见故障排查汇总

8.1 FFmpeg 报错:无法打开输出文件

  • 原因:使用 http:// 推流协议存在兼容性缺陷

  • 解决:替换为 icecast:// 官方专用协议(本教程命令已修复)

8.2 Icecast 页面显示 No mounts! 无挂载点

  1. 确认 icecast2 服务状态为 active (running)

  2. 确认推流密码 yjz129 与配置文件完全一致,无多余空格

  3. 监听地址配置 bind-address=0.0.0.0,局域网设备才能接入

  4. 新开终端执行 journalctl -u icecast2 -f 实时观察连接日志

8.3 禁止直接执行 icecast2 -c 手动启动

手动前台运行会触发日志、配置文件权限报错,统一使用 systemctl 管理服务。

8.4 yt-dlp 抓取 403 / 无法获取音频

  1. cookies.txt 过期,重新导出覆盖文件

  2. 完整保留 UA、Referer、Origin 防盗链请求头参数

  3. 延长 --sleep-requests 数值,降低请求频率

8.5 VLC 无法打开 MRL 串流

  1. FFmpeg 推流终端关闭,音频流已断开

  2. 播放地址末尾必须添加 .m3u

  3. 服务器防火墙放行 8000 端口

  4. 确认内网 IP 地址填写正确

8.6 日志大量 PRNG /hostname FQDN 警告

该类警告仅影响公网 YP 广播目录上架,内网收听完全不受影响,无需处理

另外

测试发现不给一些参数也是没问题的,看来关键还是cookies.txt yt-dlp –cookies ./cookies.txt -f bestaudio -o - “https://www.bilibili.com/video/BV1JuJg61Erz?vd_source=b56d1c2a8432369e046076e4b0b ad6fa&p=42&spm_id_from=333.788.videopod.episodes” | ffmpeg -re -i pipe:0 -vn -c:a libmp3lame -b:a 96k -ar 44100 -ac 2 -f mp3 icecast://source:123123 @192.168.1.107:8000/b

电台名称等,但在我的收音机上没显示,应该是收音机固件所致。
icecast://source:yjz129@192.168.1.107:8000/b?ice_name=私人电子书电台&ice_description=B站有声书专属收听&ice_genre=有声读物

考虑到收音机的音质,还需要ffmpeg对音频进行优化。但尚未解决。

相关文章