基于复杂地形的六足救援机器人(1)—音视频流媒体信息网络传递
作者:HNFNU–六足机器人项目组(晨灿、垚、致远、曼)
特别致谢:chatgpt3.5(在因不恰当的ffmpeg命令报错而不知所措时,是它帮了我们,解决了横陈在我们面前的这道沉疴)
关键词:ffmpeg、nginx、rtmp、USB声卡、CSI摄像头、树莓派、ngrok、motion
注:本文仅作为思路分享,本着不重复造轮子的原则,具体配置细节,如果有相异处会指出,否则还请各位拜访原文了解详细配置
一、摘要:
1.方案一:http协议–局域网+广域网视频直播
2.方案二:RTMP协议–局域网+广域网音视频直播
二、第一版处理方案:(垚、致远整理)
仅使用树莓派CSI摄像头,通过ngrok进行局域网与广域网视频直播
①优点:
1.部署简单、可以在局域网中实现延迟极低的传播
2.可以较为简单的在手机、PC等设备通过浏览器直接访问
②缺点:
1.视频资源投射到公网后,时延较大(这个问题无论是什么解决方案都很难避免)
2.只能将视频映射到ngrok分配的指定域名
3.只支持http协议的直播
4.不支持音视频混合
5.不利于python代码的本地拉流,利用opencv进行二次开发
③ 参考链接:(先2后1)
链接2实现局域网视频直播,链接1在2的基础上实现广域网直播
1.ngrok在树莓派配置、使用的视频教程
2.树莓派4b摄像头(拍照+录像+监控(基于motion))
④注意事项:
1.我们预设的视频直播的端口是8081,在配置ngrok时请在相应的配置处予以替换
2.此方案配置完成后的工作顺序一般是:
1、打开motion(无论是进行局域网直播、广域网直播,此步都不可少,这一步之后,树莓派摄像头才会激活,可以观察到,此命令键入时,CSI摄像头红灯亮起并保持常亮,开始工作)
sudo motion
此时已经可以通过局域网查看直播
此外若想关闭motion,可键入sudo killall -TERM motion
2.广域网推流(需在下载的安装包解压的文件夹路径下运行,当前可用的最低版本为V3.2)
./ngrok authtoken 您的授权令牌(Your Authtoken)
./ngrok http 8081(8081是自定义摄像头的端口)
此时命令行界面显示2个分配好的域名,通过浏览器访问任意一个即可观看直播
三、第二版处理方案(晨灿、致远整理)
此时树莓派增加外设–绿联USB声卡+麦克风,本地搭建nginx服务器,使用ffmpeg命令,将树莓派外设的音视频资源混合编码后,传输至nginx服务器,由其推流至互联网直播平台(RTMP协议),同时保留一路局域网直播,待python代码拉流利用
①注意事项:
1.声卡有2个插孔,一个接输出设备(耳机),一个接输入设备(麦克风),不要接错了
2.nginx并非必要,也可以直接使用ffmpeg命令直接推流
#如果nginx推流出现问题无法运行,可使用以下命令,使用ffmpeg直接纯视频推流,绕过nginx
ffmpeg -f video4linux2 -s 1280x720 -i /dev/video0 -c:v h264_omx -b:v 400k -f flv 直播网站rtmp推流地址
3.RTMP协议的直播流在一般的浏览器上是不能直接访问的(除非是推流至直播平台后),局域网若想访问直播内容,需下载VNC播放器进行拉流
4.bilibil直播串流密钥是会实时改变的,每一次推流都需要注意在push.conf配置文件中更改,否则会推流失败,为了便于操作,编写了一脚本帮助操作(见下文)
(另附直播间配置传送门便于访问:开播设置-个人中心-bilibli)
5.在第二版解决方案中,无需使用motion激活摄像头,否则ffmpeg推流时会显示摄像头正忙而推流失败(被motion程序占用了)
6.nginx服务器IP问题:nginx服务器架设在设备本身,在后续使用ffmpeg指令推送直播流到服务器时,要注意核对命令中的ip地址是否与当前设备的ip一致(如果设备经常在不同的路由器或者热点间切换连接,分配到的ip肯定会改变的)
7.ffmpeg推流命令中的地址分析:以rtmp://192.168.43.79:1935/live/audio为例:
(1)192.168.43.79:设备ip,因人而异,通过ifconfig自行查看修改
(2)1935:rtmp协议的端口号,可修改(在nginx.config一并修改)但最好不要,如果前面的配置与参考博客一致的话
(3)live:在nginx.conf中RTMP 模块定义的若干个 RTMP 服务器实例之一中包含的一个名为 live 的应用程序
(4)audio:任意命名
8.
②参考链接:(按照操作步骤的先后顺序)
1.使用 树莓派4b + 官方CSI摄像头 + usb声卡 实现推流直播
(先按照此链接进行配置直到“二、合并音视频推流”前,参考其ffmpeg命令但不使用,且不采用最后的脚本)
2.树莓派FFmpeg搭配nginx rtmp服务器实现直播推流
(参考至“启动ffmpeg开始推流”之前,在本人实操中,按照启动ffmpeg开始推流实操,会出现问题)
3.FFmpeg+nginx实现b站推流直播
(参考至“填写b站推流”服务器地址“和”串流秘钥”前)
(此后继续往后参考至“新增节目单文件playlist.txt”前)
最后使用的推流命令:
ffmpeg -f video4linux2 -s 1280x720 -i /dev/video0 -f alsa -i plughw:1,0 -ac 1 -c:v h264_omx -b:v 400k -c:a aac -b:a 500k -f flv rtmp://192.168.1.102/live/audio
4.(视频教程)使用nginx-rtmp打造简易直播系统-哔哩哔哩
5.python opencv拉取rtmp流
③脚本(命名bilibili_push_start.bash,放置于任意路径)
#!/bin/bash
#文件功能:将修改push.conf中rtmp推流地址与启动ffmpeg推流的步骤集成,用户只需输入推流地址的服务器地址、密钥即可自动开始推流
# 提示用户输入直播服务器地址
echo "请输入哔哩哔哩直播服务器地址:"
read string1
# 提示用户输入直播串流密钥
echo "请输入哔哩哔哩直播串流密钥:"
read string2
# 拼接两个字符串
combined_string="${string1}${string2}"
# 打印拼接后的字符串
echo "推流地址:$combined_string"
# 定义配置文件路径(因人而异,有可能需要修改)
config_file="/usr/local/nginx/conf/push.conf"
# 覆盖写入字符串到配置文件
# >--覆盖写入 >>--追加写入
command_1="push "
command_2=";"
echo "${command_1}${combined_string}${command_2}" > "$config_file"
# 提示完成
echo "推流地址已写入 $config_file"
# 提示用户输入IP地址
echo "请输入RTMP服务器IP地址(也就是当前设备的ip地址):"
read ip_address
# 定义 ffmpeg 命令
ffmpeg_command="ffmpeg -f video4linux2 -s 1280x720 -i /dev/video0 -f alsa -i plughw:1,0 -ac 1 -c:v h264_omx -b:v 400k -c:a aac -b:a 500k -f flv rtmp://${ip_address}:1935/live/audio"
# 打印 ffmpeg 命令以供确认
echo "即将执行的 ffmpeg 命令:$ffmpeg_command"
# 激活启动nginx服务器
# 在这里添加启动 nginx 服务器的命令,例如:
sudo systemctl start nginx
# 执行 ffmpeg 命令
$ffmpeg_command
#在该路径打开命令行窗口
#第一次创建后赋予脚本可执行权限(后面使用就不需要了)
chmod 777 bilibili_push_start.bash
#每次执行时键入
sudo ./bilibili_push_start.bash
④直播资源访问:
1.局域网(PC端):VLC播放器–>媒体–>打开网络串流–>网络–>输入对应rtmp地址
2.局域网(python代码)
import cv2
cap = cv2.VideoCapture('rtmp://192.168.100.79/live/audio')(根据实际情况修改)
3.广域网:直接访问直播间即可