当前位置: 首页 > news >正文

AIoT应用开发:如何远程查看摄像头,RTSP/RTMP 推流了解下?

最近一直在打造 AI 对话机器人:

项目基于移动端 arm 开发板,不得不说,这方面的需求还真不少。

前两天把摄像头接入了进来,一位家中有娃的粉丝朋友问:能否远程查看摄像头的监控画面,这样就可以随时查看孩子的活动了。

必须能!不仅可以实时查看视频,还可以通过我们之前打造的微信AI机器人,将发现的异常情况,实时通报到你的微信端。

PS:有类似需求的小伙伴,欢迎通过公众号链接我。

今日分享,就带大家实操:如何实现远程访问摄像头的监控数据

1. 流媒体是如何传输的

要实现远程访问,当然离不开网络!

相信大家都听说过 HTTP(超文本传输协议),HTTP 主要用于在Web上传输超文本(如HTML),它是Web的基础协议。

和 HTTP 类似,流媒体传输协议主要有两种:RTSP(Real-Time Streaming Protocol)和 RTMP(Real-Time Messaging Protocol)

这哥俩有什么区别么?

  1. 传输方式
  • RTSP:通常通过UDP或TCP传输,适合实时应用,延迟较小。
  • RTMP:主要通过TCP传输,确保数据的可靠性,在处理高并发流时表现良好。最初由Adobe开发,用于Flash播放器。
  1. 应用场景
  • RTSP:常用于监控摄像头、视频点播等场景。
  • RTMP:广泛用于直播流媒体(如 YouTube 等)。

如何利用这两种协议成功实现推流呢?

下面我们介绍两种方法

  • Nginx 实现 RTMP 推流
  • MediaMTX 实现 RTSP/RTMP 推流

2. Nginx 实现 RTMP 推流

Nginx 不支持 RTSP 推流,只有在安装 RTMP 支持后,才可以转发 RTMP 的数据。

2.1 安装 Nginx 和 RTMP 支持

Nginx 是啥?如何安装?不了解的小伙伴,可参考猴哥这篇教程:免费域名注册 & Cloudflare 域名解析 & Ngnix端口转发

如果你已装了 Nginx,还要查看 Nginx 是否安装了 RTMP 支持,输入nginx -V,如果没有nginx-rtmp-module等内容,则需要重新编译安装 Nginx。

编译安装 Nginx 并不复杂,参考如下步骤即可:

cd ~/tools
mkdir nginx 
cd nginx
wget https://nginx.org/download/nginx-1.26.1.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/refs/heads/master.zip
tar -xf nginx-1.26.1.tar.gz
unzip master.zip
cd nginx-1.26.1/
# 安装 PCRE 库来启用 HTTP 重写模块
sudo apt-get install libpcre3 libpcre3-dev
# 编译
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
make
sudo make install
# 默认安装在:/usr/local/nginx/sbin/nginx

2.2 启动 RTMP 服务器

假设已安装好 Nginx,首先查看配置文件在哪:

sudo /usr/local/nginx/sbin/nginx -t
# 输出
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

打开配置文件,添加以下配置:

rtmp {server {listen 10035;chunk_size 4096;application live {live on;record off;}}
}

修改配置文件后,记得一定要重启 Nginx,否则配置无法生效。

sudo /usr/local/nginx/sbin/nginx

至此,RTMP 服务器已成功启动,正在监听 localhost:10035,地址是rtmp://<your_ip>:10035/

接下来,我们还需要用另外一个工具把视频流,推送到上面这个地址上。

2.3 FFmpeg 推 RTMP 流

sudo apt install ffmpeg
ffmpeg -version

确保已经成功安装 FFmpeg,然后使用以下命令开始推流:

ffmpeg -f v4l2 -i /dev/video2 -c:v libx264 -f flv rtmp://localhost:10035/live/stream

参数说明:

  • -f v4l2:指定视频输入格式为 V4L2(Video for Linux 2)。
  • -i /dev/video2:指定摄像头设备。
  • -c:v libx264:使用 H.264 编解码器。
  • -f flv:输出格式为 FLV。
  • rtmp://localhost:10035/live/stream:指定 RTMP 服务器地址。

看到如下信息,代表推流成功:

frame= 1188 fps= 30 q=29.0 size=     664kB time=00:00:37.93 bitrate= 143.5kbits/s speed=0.951x

3. MediaMTX 实现 RTSP/RTMP 推流

MediaMTX 是一个更高效、更简洁的多协议流媒体服务器,支持包括 RTSP、RTMP、HLS、WebRTC 等多种协议。

3.1 启动 MediaMTX

前往:https://github.com/bluenviron/mediamtx/releases
找到对应操作系统和 CPU 架构的安装包,比如我的是 Linux + ARM 架构:

wget https://github.com/bluenviron/mediamtx/releases/download/v1.9.1/mediamtx_v1.9.1_linux_arm64v8.tar.gz
cd mediamtx

配置文件mediamtx.yml在当前目录下,可根据需要进行修改:

rtmp: yes
rtmpAddress: :8554
rtmp: no
rtmpAddress: :1935

执行如下命令,默认情况下,MediaMTX 会启动一个支持多协议的服务器,监听配置文件中的端口。

./mediamtx

看到如下日志,说明 RTSP 服务已启动:

2024/09/21 16:18:27 INF MediaMTX v1.9.1
2024/09/21 16:18:27 INF configuration loaded from /home/aidlux/tools/mediamtx/mediamtx.yml
2024/09/21 16:18:27 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)

接下来开始推流!

3.2 FFmpeg 推 RTSP 流

ffmpeg -f v4l2 -i /dev/video2 -c:v libx264 -f rtsp rtsp://localhost:8554/live/stream

参数说明:

  • -f rtsp:注意 RTSP 不支持 flv 容器格式,这里应该是 rtsp。

4. 如何获取视频流数据

推流成功后,就可以在远程客户端查看视频数据了,如何实现?

下面先介绍最常见的两种方式。

4.1 FFmpeg 获取视频流

示例代码如下:

# 安装`ffmpeg-python`包
pip install ffmpeg-python
# 代码中添加
import ffmpeg
rtmp_url = "rtmp://192.168.10.2:10035/live/stream"
ffmpeg.input(rtmp_url).output("1.jpg", vframes=1)global_args('-loglevel', 'error').run()

4.2 OpenCV 获取视频流

示例代码如下:

import cv2
rtmp_url = "rtsp://192.168.10.2:8554/live/stream"
cap = cv2.VideoCapture(rtmp_url)
while True:ret, frame = cap.read()cv2.imshow("frame", frame)

在 xfce 桌面成功显示:

在如何在手机端部署大模型?中,已经向大家介绍过 AidLux。如果你已有 AidLux 环境,也推荐了解下获取视频流的第三种方式。

4.3 AidStream 获取视频流

AidStream 是 AidLux 推出的用来构建流媒体应用的框架。

AidStream 核心是 pipeline,你只需为每条 pipeline 配置输入流输出流即可。注意:输入流只支持 rtsp 流。

参考文档:https://v2.docs.aidlux.com/sdk-api/aid-stream/aidstream_for_python

比如要把 rtsp 输出到屏幕:

import aidstream
inrtsp = "rtsp://192.168.10.2:8554/live/stream"
pipelines = aidstream.ast()
pipelines.add(input=inrtsp)
pipelines.build()
while True:frame = pipelines.read()pipelines.show(frame)

上述代码暂未成功,难道要屏幕分辨率和摄像头分辨率一致?懂的小伙伴评论区交流下。

注:如需外网访问, 192.168.10.2 要更换为设备的公网 IP 地址,有小伙伴问,我没有公网 IP 咋办?内网穿透了解下:👉【白嫖 Cloudflare】之 免费内网穿透,让本地AI服务,触达全球

写在最后

本文带大家了解了RTSP和RTMP两大流媒体传输协议,并实操了如何实现远程监控。

基于此,可以对获取的视频流进行 AI 处理,实现更多好玩且实用的创意,敬请期待!

如果对你有帮助,欢迎点赞收藏备用。


为方便大家交流,新建了一个 AI 交流群,欢迎对AIoTAI工具AI自媒体等感兴趣的小伙伴加入。

最近打造的微信机器人小爱(AI)也在群里,公众号后台「联系我」,拉你进群。


猴哥的文章一直秉承分享干货 真诚利他的原则,最近陆续有几篇分享免费资源的文章被CSDN下架,申诉无效,也懒得费口舌了,欢迎大家关注下方公众号,同步更新中。


http://www.mrgr.cn/news/35856.html

相关文章:

  • Vector Optimization – Stride
  • 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程
  • 外星人入侵
  • SQL的基本CRUD操作
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十三:将AVFrame转换成AVPacket。视频编码原理.编码相关api
  • TypeScript 中的三斜杠指令语法
  • 什么是组态、组态的应用场景介绍
  • UE4_Niagara基础实例—使用自定义参数
  • 图论系列(dfs)9.25
  • 问题:机器字长为n位的二进制数可以用补码来表示()个不同的有符号定点整数。
  • 2.1 HuggingFists系统架构(一)
  • java-substring 使用及注意事项
  • Elasticsearch7.7.1集群不能相互发现的问题解决以及Elasticsearch7.7.1安装analysis-ik中文分词插件的应用
  • 【ARM 嵌入式 C 入门及渐进 6.1 -- GCC 内建函数详细介绍】
  • 【Java】1.初识Java
  • 护网的过程
  • 汉王友基携手龙华区青少年宫,共推数字艺术美育新发展
  • 2024年汉字小达人区级自由报名比赛正式开始,大家最关注的问题解答
  • React学习笔记(四)——React 组件生命周期
  • 多目标跟踪中的关联代价函数
  • 前端面试题(三)
  • <<编码>> 第 17 章 自动操作(3)--带控制器的自动加法器 示例电路
  • VulgarHuman新歌《一街好戏》上线 嗨爆青岛里院喜剧节
  • EfficientNet(2019):基于复合缩放的自动化架构搜索高效网络!
  • VSCode/VS2019#include头文件时找不到头文件:我的解决方法
  • 大数据平台符合信创(CDH国产化代替)详细方案(企业内部不外传方案)