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

直播间地址: http://live.bilibili.com/21614697 (欢迎关注哦~)
准备工作
(1)前提条件
a.首先要有一个树莓派,并连接了摄像头(USB摄像头)。并能够访问网络。
b.在Bilibili中通过实名认证,并开通了直播间。点击连接开通直播间(很简单的,实名认证通过后直接就可以开通了)
c.FFmpeg。推流默认使用FFmpeg,树莓派官方系统默认安装了的,我就不再赘述,其它系统请自行安装。
(2)获取程序
下载编译好的程序:
wget https://github.com/withsalt/BilibiliLiveTools/releases/latest/download/BilibiliLiver_Linux_ARM.zip --no-check-certificate
(2)解压并授权
unzip BilibiliLiver_Linux_ARM.zip && chmod -R 755 BilibiliLiver_Linux_ARM && chmod +x BilibiliLiver_Linux_ARM/BilibiliLiver
(3)编辑配置文件
编辑用户配置文件User.json
cd BilibiliLiver_Linux_ARM/
nano appsettings.json
编辑直播配置文件
{
"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推流命令。
sudo ./BilibiliLiver
输出下面的就表示开始直播啦~

如果希望在后台持续直播,可以将上面一条命令替换为:
sudo nohup ./BilibiliLiver /dev/null 2>live.log
程序将会在后台运行。
或者编写一个系统服务,设置开机启动,控制开始关闭推流什么的。
sudo nano /etc/systemd/system/bilibiliLiver.service
将下方代码中的执行路径替换为BilibiliLiver程序所在的绝对路径。比如“/home/pi/BilibiliLiver_Linux_ARM/BilibiliLiver”,注意大小写。
[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,开启推流服务。
sudo systemctl start bilibiliLiver
检查命令是否配置正确已经程序是否正常工作。
sudo systemctl status bilibiliLiver
其它服务维护命令。
sudo systemctl stop bilibiliLiver #停止推流服务
sudo systemctl enable bilibiliLiver #设置开机启动
sudo systemctl disable bilibiliLiver #禁用开机启动
FFmpeg的使用
无论是Windows还是Linux,运行环境无论是PC还是树莓派,如果使用FFmpeg推流,都要在上面安装好FFmpeg,并在命令行中执行ffmpeg -version后可以准确的获取ffmpeg的相关信息。

至于如何在各种环境中安装ffmpeg我就不在此赘述,网上有很多详细的教程。树莓派官方系统是内置了ffmpeg的,不用自己再编译安装。
以下是树莓派Raspbian系统中推流命令:
#推流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系统中推流命令:
#推流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推流时,帧数大概在10帧左右,这个帧数并不理想,而且还在用树莓派硬件解码的情况下。但是也是目前我能找到的最优解了,如果还有更好的方案,欢迎留言或提交issue。
B站直播间分类及ID
开播时需要将ID填写到LiveSetting.json中的LiveCategory中。
| ID | 分类名称 | 分区名称 |
|---|---|---|
| 80 | 绝地求生 | 网游 |
| 86 | 英雄联盟 | 网游 |
| 88 | 穿越火线 | 网游 |
| 89 | CS:GO | 网游 |
| 87 | 守望先锋 | 网游 |
| 252 | 逃离塔科夫 | 网游 |
| 102 | 最终幻想14 | 网游 |
| 329 | VALORANT | 网游 |
| 84 | 300英雄 | 网游 |
| 91 | 炉石传说 | 网游 |
| 92 | DOTA2 | 网游 |
| 181 | 魔兽争霸3 | 网游 |
| 78 | DNF | 网游 |
| 388 | FIFA | 网游 |
| 82 | 剑网3 | 网游 |
| 83 | 魔兽世界 | 网游 |
| 240 | APEX英雄 | 网游 |
| 318 | 使命召唤:战区 | 网游 |
| 249 | 星际战甲 | 网游 |
| 115 | 坦克世界 | 网游 |
| 248 | 战舰世界 | 网游 |
| 316 | 战争雷霆 | 网游 |
| 383 | 战意 | 网游 |
| 196 | 无限法则 | 网游 |
| 114 | 风暴英雄 | 网游 |
| 93 | 星际争霸2 | 网游 |
| 239 | 刀塔自走棋 | 网游 |
| 164 | 堡垒之夜 | 网游 |
| 251 | 枪神纪 | 网游 |
| 81 | 三国杀 | 网游 |
| 112 | 龙之谷 | 网游 |
| 173 | 古剑奇谭OL | 网游 |
| 176 | 幻想全明星 | 网游 |
| 300 | 封印者 | 网游 |
| 288 | 怀旧网游 | 网游 |
| 298 | 新游前瞻 | 网游 |
| 331 | 星战前夜:晨曦 | 网游 |
| 350 | 梦幻西游端游 | 网游 |
| 107 | 其他游戏 | 网游 |
| 35 | 王者荣耀 | 手游 |
| 256 | 和平精英 | 手游 |
| 321 | 原神 | 手游 |
| 163 | 第五人格 | 手游 |
| 395 | LOL手游 | 手游 |
| 330 | 公主连结Re:Dive | 手游 |
| 292 | 火影忍者 | 手游 |
| 255 | 明日方舟 | 手游 |
| 418 | 四叶草剧场 | 手游 |
| 37 | Fate/GO | 手游 |
| 449 | 机动战姬:聚变 | 手游 |
| 36 | 阴阳师 | 手游 |
| 442 | 坎公骑冠剑 | 手游 |
| 448 | 天地劫:幽城再临 | 手游 |
| 140 | 决战!平安京 | 手游 |
| 293 | 战双帕弥什 | 手游 |
| 407 | 游戏王:决斗链接 | 手游 |
| 408 | 天谕 | 手游 |
| 389 | 天涯明月刀 | 手游 |
| 40 | 崩坏3 | 手游 |
| 386 | 使命召唤手游 | 手游 |
| 41 | 狼人杀 | 手游 |
| 411 | 幻书启世录 | 手游 |
| 286 | 百闻牌 | 手游 |
| 280 | 王者模拟战 | 手游 |
| 333 | CF手游 | 手游 |
| 154 | QQ飞车 | 手游 |
| 113 | 碧蓝航线 | 手游 |
| 352 | 三国杀移动版 | 手游 |
| 269 | 猫和老鼠 | 手游 |
| 354 | 综合棋牌 | 手游 |
| 250 | 自走棋手游 | 手游 |
| 156 | 影之诗 | 手游 |
| 206 | 剑网3指尖江湖 | 手游 |
| 343 | DNF手游 | 手游 |
| 290 | 双生视界 | 手游 |
| 342 | 梦幻西游手游 | 手游 |
| 305 | 我的勇者 | 手游 |
| 262 | 重装战姬 | 手游 |
| 189 | 明日之后 | 手游 |
| 50 | 部落冲突:皇室战争 | 手游 |
| 39 | 少女前线 | 手游 |
| 42 | 解密游戏 | 手游 |
| 203 | 忍者必须死3 | 手游 |
| 178 | 梦幻模拟战 | 手游 |
| 258 | BanG Dream | 手游 |
| 212 | 非人学园 | 手游 |
| 263 | 辐射:避难所Online | 手游 |
| 214 | 雀姬 | 手游 |
| 265 | 跑跑卡丁车 | 手游 |
| 340 | 黑潮之上 | 手游 |
| 274 | 新游评测 | 手游 |
| 98 | 其他手游 | 手游 |
| 236 | 主机游戏 | 单机游戏 |
| 216 | 我的世界 | 单机游戏 |
| 283 | 独立游戏 | 单机游戏 |
| 412 | 怪物猎人:崛起 | 单机游戏 |
| 455 | 尼尔:人工生命 | 单机游戏 |
| 276 | 恐怖游戏 | 单机游戏 |
| 237 | 怀旧游戏 | 单机游戏 |
| 424 | 鬼谷八荒 | 单机游戏 |
| 357 | 糖豆人 | 单机游戏 |
| 218 | 饥荒 | 单机游戏 |
| 217 | 怪物猎人:世界 | 单机游戏 |
| 438 | Loop Hero | 单机游戏 |
| 313 | 仁王2 | 单机游戏 |
| 277 | 命运2 | 单机游戏 |
| 221 | 战地5 | 单机游戏 |
| 245 | 只狼 | 单机游戏 |
| 282 | 使命召唤 | 单机游戏 |
| 447 | 霓虹深渊 | 单机游戏 |
| 426 | 重生细胞 | 单机游戏 |
| 443 | 永劫无间 | 单机游戏 |
| 431 | 小小梦魇 | 单机游戏 |
| 456 | 炼金工房 | 单机游戏 |
| 453 | 斩妖Raksasi | 单机游戏 |
| 452 | 异界之上 | 单机游戏 |
| 451 | 火焰审判 | 单机游戏 |
| 441 | 雨中冒险2 | 单机游戏 |
| 432 | 英灵神殿 | 单机游戏 |
| 422 | 戴森球计划 | 单机游戏 |
| 226 | 荒野大镖客2 | 单机游戏 |
| 435 | 节奏医生 | 单机游戏 |
| 228 | 精灵宝可梦 | 单机游戏 |
| 309 | 植物大战僵尸 | 单机游戏 |
| 227 | 刺客信条 | 单机游戏 |
| 387 | 恐鬼症 | 单机游戏 |
| 270 | 人类一败涂地 | 单机游戏 |
| 295 | 方舟 | 单机游戏 |
| 396 | Among Us | 单机游戏 |
| 433 | 格斗游戏 | 单机游戏 |
| 362 | NBA2K | 单机游戏 |
| 244 | 鬼泣5 | 单机游戏 |
| 308 | 塞尔达 | 单机游戏 |
| 243 | 全境封锁2 | 单机游戏 |
| 247 | 探灵笔记 | 单机游戏 |
| 402 | 赛博朋克2077 | 单机游戏 |
| 219 | 以撒 | 单机游戏 |
| 427 | 烟火 | 单机游戏 |
| 257 | 全面战争 | 单机游戏 |
| 326 | 骑马与砍杀 | 单机游戏 |
| 364 | 枪火重生 | 单机游戏 |
| 302 | FORZA 极限竞速 | 单机游戏 |
| 311 | 女神异闻录5 | 单机游戏 |
| 230 | 任天堂明星大乱斗 | 单机游戏 |
| 341 | 盗贼之海 | 单机游戏 |
| 273 | 无主之地3 | 单机游戏 |
| 261 | 马里奥制造2 | 单机游戏 |
| 319 | 东方大战争 | 单机游戏 |
| 220 | 辐射76 | 单机游戏 |
| 410 | 封灵档案 | 单机游戏 |
| 437 | Everhood | 单机游戏 |
| 421 | 归家异途 | 单机游戏 |
| 382 | 橙光 | 单机游戏 |
| 439 | 恐惧之间 | 单机游戏 |
| 436 | 泡沫冬景 | 单机游戏 |
| 446 | 双人成行 | 单机游戏 |
| 440 | 生化入侵 | 单机游戏 |
| 450 | 先驱者 | 单机游戏 |
| 454 | 甜蜜之家 | 单机游戏 |
| 235 | 其他单机 | 单机游戏 |
| 379 | 全面战争:竞技场 | 单机游戏 |
| 21 | 视频唱见 | 娱乐 |
| 145 | 视频聊天 | 娱乐 |
| 207 | 舞见 | 娱乐 |
| 123 | 户外 | 娱乐 |
| 399 | 日常 | 娱乐 |
| 339 | 放松电台 | 电台 |
| 190 | 唱见电台 | 电台 |
| 192 | 聊天电台 | 电台 |
| 193 | 配音 | 电台 |
| 371 | 虚拟主播 | 虚拟主播 |
| 404 | 赛博朋克2077虚拟区 | 虚拟主播 |
| 367 | 美食 | 生活 |
| 369 | 萌宠 | 生活 |
| 378 | 时尚 | 生活 |
| 33 | 影音馆 | 生活 |
| 376 | 人文社科 | 学习 |
| 375 | 科技科普 | 学习 |
| 377 | 职业技能 | 学习 |
| 372 | 陪伴学习 | 学习 |
| 373 | 绘画 | 学习 |
文章评论
想问一下直接把你的GitHub项目把FFmpeg改为推流视频可以实现嘛
@方成 没懂你的意思,ffmpeg本身就是用来推流的。
你好,我想问一下,如果不想推流了,该用什么方法停止树莓派推流呢?
@༺行尸༻ 唔,没懂你意思,直接拔电源不就行了。不拔电源关闭推流服务也行撒。
@afirefish 就是想问有没有能通过代码控制的关闭推流的指令,而不需要手动控制。我想设置一个按钮来控制开始推流和结束推流。
@༺行尸༻ 要用这个项目的话,你得自己拉代码来改了。做这玩意儿主要是考虑全天候的,没考虑过关[笑哭]
@afirefish 好的谢谢,那我只能通过kill杀死推流指令进程来实现了。
如果使用CSI的摄像头应该怎么修改命令呢