养了条小鱼,想随时随地看看怎么办?各个直播平台就是最好的选择了。不用自己搭建RTMP服务器,还能和大家一起分享,何乐而不为呢?当然,比较注重隐私,可以自己搭建一个直播推流服务器,同样可以实现随时随地查看。搭建方式可以查看这篇博客:传送门

    效果图

    直播间地址: http://live.bilibili.com/21614697 (欢迎关注哦~)

    树莓派自动化推流摄像头到Bilibili直播 - 夸克之书 - 图1

    html5: Unsupported video format. Try installing Adobe Flash.

    play-rounded-fill play-rounded-outline play-sharp-fill play-sharp-outline

    pause-sharp-outline pause-sharp-fill pause-rounded-outline pause-rounded-fill

    准备工作

    (1)前提条件

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

    (2)获取程序

    下载编译好的程序:

    1. wget https://github.com/withsalt/BilibiliLiveTools/releases/download/1.3.0/BilibiliLiveTools_ARM32.zip

    (2)解压并授权

    1. unzip BilibiliLiveTools_ARM32.zip && chmod -R 775 BilibiliLiveTools_ARM32 && chmod +x BilibiliLiveTools_ARM32/BilibiliLiveTools

    (3)编辑配置文件

    编辑用户配置文件User.json

    1. cd BilibiliLiveTools_ARM32
    2. nano Settings/Users.json #输入用户名和密码

    编辑直播配置文件

    1. nano Settings/LiveSetting.json
    2. {
    3. "LiveCategory": "28", //直播间分类
    4. "LiveRoomName": "【24H】小金鱼啦~", //直播间名称
    5. "CmdString": "ffmpeg -thread_queue_size 1024 -f video4linux2 -s 1280*720 -i "/dev/video0" -stream_loop -1 -i "Source/demo_music.m4a" -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 [[URL]]", //推流命令
    6. "AutoRestart": true //推流命令异常结束后是否自动重新开始
    7. }

    由于推流方式不同以及FFmpeg配置的多边性,这里采用直接填写推流命令的方式。建议填写之前先测试推流命令能否正确执行。

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

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

    开始直播

    继续输入

    1. sudo ./BilibiliLiveTools

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

    树莓派自动化推流摄像头到Bilibili直播 - 夸克之书 - 图2

    开始直播输出

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

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

    程序将会在后台运行。

    FFmpeg的使用

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

    树莓派自动化推流摄像头到Bilibili直播 - 夸克之书 - 图3

    ffmpeg命令行输出

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

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

    1. #推流USB摄像头(包含音频,音频源为音频文件)
    2. ffmpeg -thread_queue_size 512 -f video4linux2 -s 1280*720 -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 "推流地址"
    3. #推流USB摄像头(包含音频,音频源麦克风)
    4. ffmpeg -thread_queue_size 512 -f video4linux2 -s 1280*720 -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 "推流地址"
    5. #推流USB摄像头(不包含音频)
    6. 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 "推流地址"
    7. #推流视频
    8. ffmpeg -re -i "视频源" -vcodec copy -acodec aac -b:a 192k -f flv "推流地址"

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

    1. #推流USB摄像头(包含音频,音频源为音频文件)
    2. 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 "推流地址"
    3. #推流USB摄像头(包含音频,音频源麦克风)
    4. 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 "推流地址"
    5. #推流USB摄像头(不包含音频)
    6. 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 "推流地址"
    7. #推流视频
    8. 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推流时,帧数大概在10帧左右,这个帧数并不理想,而且还在用树莓派硬件解码的情况下。但是也是目前我能找到的最优解了,如果还有更好的方案,欢迎留言或提交issue。