树莓派自动化推流摄像头到Bilibili直播

树莓派/玩客云闲置怎么办?用来直播推流呀

withsalt/BilibiliLiveTools: Bilibili直播工具

直播间演示:

https://live.bilibili.com/21577989

准备工作

(1)前提条件

a.首先要有一个树莓派,并连接了摄像头(USB摄像头)。并能够访问网络。
b.在Bilibili中通过实名认证,并开通了直播间。点击连接开通直播间(很简单的,实名认证通过后直接就可以开通了)
c.FFmpeg。推流默认使用FFmpeg,树莓派官方系统默认安装了的,我就不再赘述,其它系统请自行安装。

(2)获取程序

下载编译好的程序:

1
wget https://github.com/withsalt/BilibiliLiveTools/releases/download/2.0.2/BilibiliLiver_Linux_ARM.zip

(2)解压并授权

1
unzip BilibiliLiver_Linux_ARM.zip && chmod -R 755 BilibiliLiver_Linux_ARM && chmod +x BilibiliLiver_Linux_ARM/BilibiliLiver

(3)编辑配置文件

编辑用户配置文件User.json

1
2
cd BilibiliLiver_Linux_ARM/
nano appsettings.json

编辑直播配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"AppSetting": {
//加密密钥,一般不需要修改,要修改的话,至少需要16位
"Key": "ac131de1-ed20-499f-8fdf-dede054dbaad"
},
"LiveSetting": {
//直播间分类
"LiveCategory": "369",
//直播间名称
"LiveRoomName": "【24H】小金鱼啦~",
//FFmpeg推流命令,请自行填写对应操作系统和设备的推流命令,默认为树莓派,且摄像头设备为‘/dev/video0’
//填写到此处时,请注意将命令中‘"’用‘\’进行转义,将推流的rtmp连接替换为[[URL]],[[URL]]不需要双引号。
"FFmpegCmd": "ffmpeg -f dshow -video_size 1280x720 -i video=\"5M USB CAM\" -vcodec libx264 -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 5000k -an -preset:v ultrafast -tune:v zerolatency -f flv [[URL]]",
//ffmpeg异常退出后,是否自动重新启动
"AutoRestart": true
},
"UserSetting": {
//B站账号
"Account": "*********",
//B站密码,放心填写,没有后门
"Password": "*********"
}
}

由于推流方式不同以及FFmpeg配置的多边性,这里采用直接填写推流命令的方式。建议填写之前先测试推流命令能否正确执行。默认的推流命令设配树莓派官方系统,其它系统可能不适用,需要自己修改。

推流命令(FFmpegCmd)中的“[[URL]]”,是一个配置符号,将在程序中被替换为获取到的Bilibili推流地址,所以一定要在最终命令中,把测试文件或者地址修改为 “[[URL]]”(URL大写) ,否则程序将抛出错误。推流命令中注意半角双引号需要用符号‘\’来进行转义。

FFmpeg的使用请查看最后一节:FFmpeg的使用

开始直播

执行推流程序。推流程序将会自动开启B站直播,并获取推流地址,然后执行预设的FFmpeg推流命令。

1
sudo ./BilibiliLiver

输出下面的就表示开始直播啦~

树莓派自动化推流摄像头到Bilibili直播开始直播输出

如果希望在后台持续直播,可以将上面一条命令替换为:

1
sudo nohup ./BilibiliLiver /dev/null 2>live.log

程序将会在后台运行。

或者编写一个系统服务,设置开机启动,控制开始关闭推流什么的。

1
sudo nano /etc/systemd/system/bilibiliLiver.service

将下方代码中的执行路径替换为BilibiliLiver程序所在的绝对路径。比如“/home/pi/BilibiliLiver_Linux_ARM/BilibiliLiver”,注意大小写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=BilibiliLiver
After=network.target

[Service]
WorkingDirectory=BilibiliLiver所在路径,比如/home/pi/BilibiliLiver_Linux_ARM
ExecStart=BilibiliLiver所在路径包含程序的路径,比如/home/pi/BilibiliLiver_Linux_ARM/BilibiliLiver
Restart=always
SyslogIdentifier=BilibiliLiver Tool
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

执行start,开启推流服务。

1
sudo systemctl start bilibiliLiver

检查命令是否配置正确已经程序是否正常工作。

1
sudo systemctl status bilibiliLiver

其它服务维护命令。

1
2
3
sudo systemctl stop bilibiliLiver    #停止推流服务
sudo systemctl enable bilibiliLiver #设置开机启动
sudo systemctl disable bilibiliLiver #禁用开机启动

FFmpeg的使用

无论是Windows还是Linux,运行环境无论是PC还是树莓派,如果使用FFmpeg推流,都要在上面安装好FFmpeg,并在命令行中执行ffmpeg -version后可以准确的获取ffmpeg的相关信息。

树莓派自动化推流摄像头到Bilibili直播ffmpeg命令行输出

至于如何在各种环境中安装ffmpeg我就不在此赘述,网上有很多详细的教程。树莓派官方系统是内置了ffmpeg的,不用自己再编译安装。

以下是树莓派Raspbian系统中推流命令:

1
2
3
4
5
6
7
8
9
10
11
#推流USB摄像头(包含音频,音频源为音频文件)
ffmpeg -thread_queue_size 512 -f video4linux2 -s 1280*720 -input_format mjpeg -i "视频源" -stream_loop -1 -i "音频源" -vcodec h264_omx -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 10M -bufsize 10M -acodec aac -ac 2 -ar 44100 -ab 128k -f flv "推流地址"

#推流USB摄像头(包含音频,音频源麦克风)
ffmpeg -thread_queue_size 512 -f video4linux2 -s 1280*720 -input_format mjpeg -i "视频源" -i "音频源" -vcodec h264_omx -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 10M -bufsize 10M -acodec aac -ac 2 -ar 44100 -ab 128k -f flv "推流地址"

#推流USB摄像头(不包含音频)
ffmpeg -thread_queue_size 512 -f video4linux2 -s 1280*720 -i "视频源" -vcodec h264_omx -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 10M -bufsize 10M -an -f flv "推流地址"

#推流视频
ffmpeg -re -i "视频源" -vcodec copy -acodec aac -b:a 192k -f flv "推流地址"

以下是Windows系统中推流命令:

1
2
3
4
5
6
7
8
9
10
11
#推流USB摄像头(包含音频,音频源为音频文件)
ffmpeg -f dshow -s 1280*720 -r 1024 -i video="视频源" -stream_loop -1 -i "音频源" -vcodec libx264 -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 5000k -acodec aac -ac 2 -ar 44100 -ab 128k -preset:v ultrafast -tune:v zerolatency -f flv "推流地址"

#推流USB摄像头(包含音频,音频源麦克风)
ffmpeg -f dshow -s 1280*720 -r 1024 -i video="视频源" -i "音频源" -vcodec libx264 -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 5000k -acodec aac -ac 2 -ar 44100 -ab 128k -preset:v ultrafast -tune:v zerolatency -f flv "推流地址"

#推流USB摄像头(不包含音频)
ffmpeg -f dshow -s 1280*720 -r 1024 -i video="视频源" -vcodec libx264 -pix_fmt yuv420p -r 30 -s 1280*720 -g 60 -b:v 5000k -an -preset:v ultrafast -tune:v zerolatency -f flv "推流地址"

#推流视频
ffmpeg -re -i "视频源" -vcodec copy -acodec aac -b:a 192k -f flv "推流地址"

以上命令没有经过仔细测试,不同环境需要不同的参数,请自行学习FFmpeg的用法。

FFmpeg基本用法:

ffmpeg [全局选项] {[输入文件选项] -i 输入文件} … {[输出文件选项] 输出文件} …

参数简单介绍:

  • -f:输入格式(video4linux2 )
  • -i:输入源
  • -s:视频分辨率
  • -r:所需的帧率
  • -vcodec:视频编解码器
  • -vb:视频比特率
  • -bufsize:缓冲区大小(对于流来说很重要)
  • -vf:像素格式
  • -g:GOP(图片组,对于流式传输很重要)
  • -an:不使用音频
  • -f:输出格式

ffmpeg翻译文档.pdf - 蓝奏云 (lanzoui.com)

树莓派在使用FFmpeg推流时,帧数大概在10帧左右,这个帧数并不理想,而且还在用树莓派硬件解码的情况下。但是也是目前我能找到的最优解了


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!