用树莓派实现24小时持续直播

作者: shisaq 日期: April 10, 2023

最近我想把“10分钟练琴系列”的视频放到直播平台循环播放,本来想着用云服务器实现,但家中落灰的树莓派说:“这事儿交给我就行了,还不用你花钱!”于是就有了下面的事情。

直播链接

http://live.bilibili.com/3544257

ssh连接树莓派

1
2
3
$ ssh pi@192.168.x.x

# 默认密码 raspberry

上传视频文件

把本地电脑的视频上传到树莓派的/home/pi/Videos/文件夹:

1
$ scp video.mp4 pi@192.168.x.x:/home/pi/Videos/

循环播放核心代码

/home/pi/目录下创建一个名为stream.sh的可执行文件,并贴入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

RTMP_URL="rtmp://live-push.bilivideo.com/live-bvc/?streamname=example"
VIDEO_DIR="/home/pi/Videos"

while true; do
  for VIDEO_FILE in $VIDEO_DIR/*.mp4; do
    ffmpeg -re -i "$VIDEO_FILE"\
           -c:v copy -c:a aac \
           -b:a 192k -strict -2 \
           -f flv $RTMP_URL
  done
done

其实就是用ffmpeg实现直播推流。这里的RTMP_URL需要自己去对应的直播平台获得。其中-c:v copy可以让树莓派不必重新解码,毕竟它性能很一般。建议把视频用HandBrake软件或其他格式转换工具提前处理一下,我处理成720p,Constant Quality是30。

最后不要忘了改一下的权限,否则之后进程管理工具会没有权限执行:

1
$ chmod +x stream.sh

进程管理工具

使用supervisorctl方便后台运行,这样即使我们关闭当前终端session,也不会影响直播进程。如果没有的话,记得先安装:

1
sudo apt install supervisor

这是几个常用的控制命令:

1
2
3
sudo supervisorctl start play
sudo supervisorctl stop play
sudo supervisorctl status

配置路径与内容

包括工作目录、要运行的脚本、容错机制与日志保存。

/etc/supervisor/conf.d/play.conf

1
2
3
4
5
6
7
8
9
10
11
[program:play]
directory=/home/pi
command=./stream.sh
autostart=true
autorestart=true
startretries=10
redirect_stderr=true
stdout_logfile=/home/pi/stream.log
stdout_logfile_maxbytes=512KB
stdout_logfile_backups=2
environment=ASPNETCORE_ENVIRONMENT="Development"