树莓派/玩客云闲置怎么办?用来直播推流呀
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": { "Key": "ac131de1-ed20-499f-8fdf-dede054dbaad" }, "LiveSetting": { "LiveCategory": "369", "LiveRoomName": "【24H】小金鱼啦~", "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]]", "AutoRestart": true }, "UserSetting": { "Account": "*********", "Password": "*********" } }
|
由于推流方式不同以及FFmpeg配置的多边性,这里采用直接填写推流命令的方式。建议填写之前先测试推流命令能否正确执行。默认的推流命令设配树莓派官方系统,其它系统可能不适用,需要自己修改。
推流命令(FFmpegCmd)中的“[[URL]]”,是一个配置符号,将在程序中被替换为获取到的Bilibili推流地址,所以一定要在最终命令中,把测试文件或者地址修改为 “[[URL]]”(URL大写) ,否则程序将抛出错误。推流命令中注意半角双引号需要用符号‘\’来进行转义。
FFmpeg的使用请查看最后一节:FFmpeg的使用
开始直播
执行推流程序。推流程序将会自动开启B站直播,并获取推流地址,然后执行预设的FFmpeg推流命令。
输出下面的就表示开始直播啦~
开始直播输出
如果希望在后台持续直播,可以将上面一条命令替换为:
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的相关信息。
ffmpeg命令行输出
至于如何在各种环境中安装ffmpeg我就不在此赘述,网上有很多详细的教程。树莓派官方系统是内置了ffmpeg的,不用自己再编译安装。
以下是树莓派Raspbian系统中推流命令:
1 2 3 4 5 6 7 8 9 10 11
| 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 "推流地址"
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 "推流地址"
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
| 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 "推流地址"
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 "推流地址"
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帧左右,这个帧数并不理想,而且还在用树莓派硬件解码的情况下。但是也是目前我能找到的最优解了