基于复杂地形的六足救援机器人(1)—音视频流媒体信息网络传递

基于复杂地形的六足救援机器人(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.广域网:直接访问直播间即可

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值