韦东山物联网流媒体实战项目-智慧家居视频监控系统(值得收藏)

一口Linux 2021-07-01 11:40

 点击上方「嵌入式云IOT技术圈」,选择「置顶公众号」第一时间查看嵌入式笔记!

作者 | 嵌入式云IOT技术圈

编排 | 嵌入式云IOT技术圈

  

  嵌入式行业的大佬韦东山老师一贯是授人以鱼不如授人以渔,作为韦东山老师的忠实粉丝,同时我们也一直保持合作与联系。从大学到职场,韦东山老师的课程给我带来了飞跃性的成长,可以说让我这个原本全日制大专的毕业生,到后来通过自己的努力考上本科,再到现在攻读国外商管类的硕士研究生,一路过来,是韦东山老师教给了我学习的方法,让我有机会一路逆袭!学习任何东西,最重要是感兴趣并且能够找到适合自己的方法,持续以恒!活到老,学到老,不忘初心,方得始终,努力改变人生,奋斗永驻青春!再次感谢韦东山老师给我们带来的流媒体知识以及项目的讲解。

  公众号后台回复:物联网 即可获得本文pdf带书签版本,本文后续还会持续更新新的项目实战经验以及企业实战知识点,敬请关注!

1、物联网实战项目-搭建智慧家居视频监控系统


1.1、什么是流媒体?

如下图所示:

(1) 推流端:开发板读取摄像头数据,然后将数据推送到服务器的过程。

(2) 流媒体服务器:服务器接收开发板推送过来的数据,然后进行处理。

(3) 拉流端:手机或者其它的设备,通过拉取访问服务器上的数据然后进行显示。

作为程序员我们需要写三个程序:

这里的程序员主要有三个:

1、嵌入式软件工程师

 在连接摄像头的ARM板子上,实现一个推送程序,它能够一边读取摄像头的数据,一边将数据推送给服务器。

2、WEB前后端软件工程师

 在服务器上,实现"流媒体服务器"程序,它能够接收ARM板子发过来的数据,并把数据转换格式发送给手机等客户端。

3、Android、IOS 、Window 等软件工程师

 在手机等客户端上,实现拉取程序,它能够从服务器上拉取数据并且显示出来。

 初学者在学习流媒体相关知识的时候,实际上我们可以将互联网功能去掉,我们直接在局域网内实现推拉流即可,我们可以把推送程序、流媒体服务器程序都在ARM板上运行,手机等客户端只能在同一个局域网里观看视频,或者如果真的需要加上互联网的功能,我们还可以使用内网穿透技术实现互联网视频监控。

 在这里我们尝试着思考两个问题:

1.开发板是通过什么协议将摄像头的数据推送到服务器?

2.手机或者是其它的设备又是通过什么协议将服务器上的数据拉取下来?

1.2、常见的流媒体协议

HLS(HTTP LiveStreaming)是基于HTTP的,是Apple公司开放的音视频传输协议。

HTTP FLV则是将RTMP封装在HTTP协议之上的,可以更好的穿透防火墙等。

参考:HTTP-FLV直播初探- 冒雨ing - 博客园(cnblogs.com)

参考:理解RTMP、HttpFlv和HLS的正确姿势- 简书 (jianshu.com)

(1)RTMP 与 HTTP-FLV 协议


协议好用,但不代表插件好用,比如我们经常会在网页上看到插件失效了。

(2)HLS 协议


所以就给 HTTP-FLV 活过来的机会:

B站开发出了 flv.js 插件,能够把Adobe公司的插件屏蔽,所以所谓的视频监控和直播是一样的道理。

如果将ffmpeg 和 Nginx 移植到ARM板上,那么这个流程就会退化成在局域网内实现,就会变成在局域网内观看摄像头的数据。

2、MJPG-steamer方案实现

这个方案比较适合在低性能的板子上实现,CPU主频200M都没问题:

它的实现原理如下:

如上所示, MJPG-steamer是一个开源的软件,我们可以将它移植到ARM板子上,然后它可以将摄像头的数据推送到手机端,然后手机端可以直接通过浏览器来直接观看摄像头数据, MJPG-steamer非常适合初学者用于学习视频监控的知识。

2.1、MJPG-steamer 的优点和缺点

优点:

·       程序简单,所有源码一目了然,便于学习

·       对ARM板的性能要求不高,主频200MHz 的ARM芯片也可以实现。

缺点:

·       只能实现局域网的视频监控

·       要实现互联网视频监控,需要另外实现内网穿透

·       MJPG-steamer没有实现声音传输

·       MJPG-steamer项目已经不再维护,仅仅建议用于学习

2.2、MJPG-steamer 视频监控原理

2.2.1、JPEG、MJPG 格式简介

                           

2.2.2、移植MJPG-steamer

在buildroot中配置:mjpg-streamer:


配置完毕以后在 Buildroot工程下执行make完成编译,然后烧写固件即可,然后就可以在ARM开发板的串口终端执行:

mjpg_streamer --help #查看帮助信息 


先要在开发板端连接好摄像头( USB ),然后再连接好网线联网,使用ifconfig 命令配置ip地址,然后执行mjpg_streamer对应的命令:

执行后即成功:

然后在浏览器端输入ip地址:192.168.1.6:8080(这是我的IP和端口号),然后点击Stream,这样就可以看到摄像头里的数据了:

这个命令的源码位于Buildroot/dl/mjpg=streamer/下。

2.2.3、MJPG-steamer代码框架分析

这个程序涉及多线程编程、网络编程、动态库等的使用,比较适合初学者学习并提高自己的应用编程水平。

server线程,等待别人来连接,每创建一个连接就会多创建一个线程。

韦老师操作的命令:看当前进程里有多少个线程:cd /proc/进程id/task/ 。

其它的用法:(在开发板端)

将jpg文件存到tmp目录,然后将 tmp目录下的jpg文件推送到浏览器。(在开发板端)

3、流媒体方案的实现之ffmpeg

3.1、ffmpeg 是什么?

3.2、简单理解下什么是ffmpeg

这里涉及到了四个层:原始数据层、编码层、容器层、协议层。

[总结]视音频编解码技术零基础学习方法_雷霄骅(leixiaohua1020)的专栏

3.3、主要的视频编码技术

[总结]视音频编解码技术零基础学习方法_雷霄骅(leixiaohua1020)的专栏

目前主要使用的视频编码格式有以下:(最常用的是H.264)

3.4、主要的音频编码技术

[总结]视音频编解码技术零基础学习方法_雷霄骅(leixiaohua1020)的专栏

目前主要使用的音频编码格式有以下:(最常用的是AAC)

3.5、ffmpeg的组成

ffmpeg 基本用法 - 简书 (jianshu.com)

如下图所示:

将 mp4 解压为音频和视频的数据、将编码数据合并为flv ==> 需要libavformat

解码和编码的过程==> 需要libavcodec

处理==> 需要libswscale、libpostproc

ffmpeg 是一个命令行工具,可以指定各种参数以及其它应用程序。

3.6、ffmpeg的重要概念

3.7、ffmpeg处理音视频的过程

3.8、ffmpeg的常用参数

3.9、移植ffmpeg

配置完毕后编译,生成固件以后将其下载到开发板上去。

如何使用ffmpge?

ffmpge --help #查看帮助信息(开发板终端)

4、流媒体方案的实现之Nginx方案

4.1、Nginx 是什么?

4.2、三种WEB服务器的比较

4.3、Nginx 在流媒体方案中的位置

4.4、让Ngnix支持RTMP、HTTPFLV协议

原生的 Ngnix 不支持 RTMP 以及 HTTPFLV ,所以我们需要移植第三方模块:

4.5、移植Nginx

在使用nginx之前,我们需要设置一下/etc/nginx/nginx,conf,在这个文件中添加rtmp节点:

让nginx支持rtmp协议,服务器会监听1935这个端口,live表示 app 的意思。

但这个端口:1935 经常会被防火墙给墙住,我们可以在 http 节点下面创建下面这个节点:

以后我们就可以使用flv协议来实现拉流的动作,当修改了配置文件以后需要重启一下nginx服务,重启命令如下:

/etc/init.d/S50nginxrestart

4.6、测试流媒体

如上所示:( ffmpeg的编解码器非常耗CPU的资源)

(1)推流方式

使用 rtmp 协议将设备结点 /dev/video1 的数据以每秒10帧( framerate )、量( -q )为10推送(推流: flv )到127.0.0.1的live这个 app 的 wei 这个路径下。

(2)拉流方式

  • 使用RTMP 协议拉流

在 VLC 播放器中点击媒体->打开网络串流,输入:rtmp://192.168.1.6/live/wei ,即可播放。

  • 使用HTTP FLV协议拉流

在 VLC 播放器中点击媒体->打开网络串流,输入:http://192.168.1.6/test?

app=live&stream=wei ,就可以实现播放了,即是从192.168.1.6的test目录的 app 为live下拉取名字叫 wei 的流。

  • 直接推送视频文件

ffmpeg -re -i test.mp4 -vcodec copy -acodeccopy -f flv rtmp://127.0.0.1/live/wei

-re表示保持当前的速度,-i表示选取一个文件,-vcodec表示视频编解码器,copy表示保持一致,-acodec表示音频编解码器,copy表示保持一致,然后将流( flv )推送到rtmp://127.0.0.1/live/wei

安装 flv.js 插件:(这样才能够直接在网页上看到直播流),参考下面这个网站,给出了很多方法:

https://pingos.io/docs/zh/quick-start#%E6%8E%A8%E6%B5%81

在开发板端的HTML文件的位置:/usr/html/目录下,这是我们网页端看推流的地方,把我们自己制作的html替换到当前目录下的html文件。

在这里看到韦老师敲命令的一个细节==>如何清除一个文件里的数据:

> 文件名

在浏览器上输入ip地址,就可以在网页上看到推流的视频了。

4.7、浏览器上观看直播流的原理

Nginx将数据流通过flv.js进行转换成html5可以识别的data,这样html5就可以显示出来了,如下图所示:

5、摄像头和声卡接口

5.1、ffmpeg如何去访问摄像头?

5.2、摄像头接口:V4L2

摄像头的数据格式:RGB、YUV、JPEG、MJPG、H.264 等等。

学习MJPG-steamer的源代码的时候,有关摄像头接口的代码在v4l2uvc.c是在这个文件里面实现的,这里列出主要的API接口:

5.3、摄像头数据在内核中的组织方法

如果能够了解摄像头的数据在内核中的组织方法,那么对摄像头数据的读取就能够彻底的掌握了!

·APP 向内核申请

·APP 把它们queue(入队)

·驱动把数据放入某个buffer

·把该buffer出列,然后处理数据

·buffer入列

以上五个步骤都是应用程序来处理队列。

5.4、声音的采集

5.5、声卡的接口:ALSA

什么是 ALSA 呢?ALSA就是AdvancedLinux Sound Architecture(先进的Linux声音架构)

5.6、让FFmpeg录制声音

-ac 指定只有一个通道。

hw:0,0 硬件的第0个声卡的第0个设备。

当然也可以用alsa的录制命令,alsa的命令比ffmeg的命令简单好用,在Buildroot中配置如下:

5.7、测试流媒体

6、内网穿透

6.1、为什么要内网穿透?

IP和端口的作用:

6.1.1、公网的IP不够用

6.1.2、对外访问时,路由器来帮忙

6.1.3、内网穿透的实现方法

(一)设置路由器(有点难度)

(二)用某些APP,比如花生壳

6.1.4、使用花生壳进行内网穿透示例

网址:https://www.oray.com/

接下来就可以进行测试推流了:查看ffmpeg如何将mp4推送到流媒体服务器。在这里要注意,推流的地址要改成花生壳的外网域名,还要注意内网IP是否会冲突,如果冲突了则需要重新更改IP,如下所示:

6.2、在公网服务器上运行Nginx

如果自己开公司,买个公网服务器,比如阿里云、华为云、腾讯云等。

6.3、如何在服务器上编译Nginx?

往期精彩

Buildroot系统构建学习笔记(以百问网imx6ull开发板为例)

Linux 驱动开发 / gpio子系统 / 快速入门

全面认识 Qt Widgets、QML、Qt Quick

圆曾经的小车梦,造一台智能小车(四)之QT上位机控制小车

会C/C++就可以开发Linux/Android应用程序?替代传统串口屏的Yoxios了解一下!

觉得本次分享的文章对您有帮助,随手点[在看]并转发分享,也是对我的支持。

一口Linux 写点代码,写点人生!
评论
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 223浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 70浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 108浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 92浏览
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 61浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 124浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 204浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 117浏览
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 61浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 141浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 164浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦