【学员源鑫笔记】韦东山物联网流媒体实战项目-智慧家居视频监控系统(值得收藏)

简介: 【学员源鑫笔记】韦东山物联网流媒体实战项目-智慧家居视频监控系统(值得收藏)

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

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

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

640.png

1.1、什么是流媒体?

如下图所示:

640.png

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

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

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

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

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

1、嵌入式软件工程师

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

2、WEB前后端软件工程师

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

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

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

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

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

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

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

1.2、常见的流媒体协议

640.png

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

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

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

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

(1)RTMP 与 HTTP-FLV 协议

640.png

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

(2)HLS 协议

640.png

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

640.png

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

640.png

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

2、MJPG-steamer方案实现

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

640.png

它的实现原理如下:

640.png

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

2.1、MJPG-steamer 的优点和缺点

优点:

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

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

缺点:

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

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

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

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

2.2、MJPG-steamer 视频监控原理

640.png

2.2.1、JPEG、MJPG 格式简介

640.png

2.2.2、移植MJPG-steamer

640.png

在buildroot中配置:mjpg-streamer:

640.png

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

640.png

mjpg_streamer --help #查看帮助信息 


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

640.png

执行后即成功:

640.png

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

640.png

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

2.2.3、MJPG-steamer代码框架分析

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

640.png

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

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

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

640.png

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

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

3.1、ffmpeg 是什么?

640.png

3.2、简单理解下什么是ffmpeg

640.png

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

640.png

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

640.png

3.3、主要的视频编码技术

640.png

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

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

640.png

3.4、主要的音频编码技术

640.png

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

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

640.png

3.5、ffmpeg的组成

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

640.png

如下图所示:

640.png

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

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

处理==> 需要libswscale、libpostproc

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

3.6、ffmpeg的重要概念

640.png

3.7、ffmpeg处理音视频的过程

640.png

3.8、ffmpeg的常用参数

640.png

3.9、移植ffmpeg

640.png

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

如何使用ffmpge?

640.png

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

4.1、Nginx 是什么?

640.png

4.2、三种WEB服务器的比较

640.png

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

640.png

4.4、让Ngnix支持RTMP、HTTPFLV协议

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

640.png

4.5、移植Nginx

640.png

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

640.png

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

640.png

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

640.png

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

/etc/init.d/S50nginxrestart

4.6、测试流媒体

640.png

如上所示:( 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

640.png

640.png

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

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

> 文件名

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

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

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

640.png

5、摄像头和声卡接口

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

640.png

5.2、摄像头接口:V4L2

640.png

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

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

640.png

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

640.png

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

·APP 向内核申请

·APP 把它们queue(入队)

·驱动把数据放入某个buffer

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

·buffer入列

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

5.4、声音的采集

640.png

640.png

5.5、声卡的接口:ALSA

640.png

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

5.6、让FFmpeg录制声音

640.png

-ac 指定只有一个通道。

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

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

640.png

5.7、测试流媒体

640.png

6、内网穿透

640.png

640.png

6.1、为什么要内网穿透?

IP和端口的作用:

640.png

6.1.1、公网的IP不够用

640.png

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

640.png

640.png

6.1.3、内网穿透的实现方法

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

640.png


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

640.png

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

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

640.png

640.png

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

640.png

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

640.png

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

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

640.png

往期精彩

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


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


全面认识 Qt Widgets、QML、Qt Quick


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


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

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
4天前
|
人工智能 监控 物联网
深度探索人工智能与物联网的融合:构建未来智能生态系统###
在当今这个数据驱动的时代,人工智能(AI)与物联网(IoT)的深度融合正引领着一场前所未有的技术革命。本文旨在深入剖析这一融合背后的技术原理、探讨其在不同领域的应用实例及面临的挑战与机遇,为读者描绘一幅关于未来智能生态系统的宏伟蓝图。通过技术创新的视角,我们不仅揭示了AI与IoT结合的强大潜力,也展望了它们如何共同塑造一个更加高效、可持续且互联的世界。 ###
|
10天前
|
传感器 安全 算法
在物联网项目中使用 MicroPython 时如何确保数据安全
在物联网项目中使用MicroPython时,确保数据安全至关重要。可通过加密通信、安全固件更新、认证机制和定期审计等方法提升安全性,防止数据泄露和设备被恶意操控。
|
10天前
|
传感器 物联网 芯片
如何在物联网项目中使用 MicroPython
本指南介绍如何在物联网项目中使用MicroPython,涵盖设备选择、环境搭建、基础编程及网络通信等内容,助你快速上手MicroPython开发。
|
1月前
|
传感器 机器学习/深度学习 存储
物联网设备精细化管理系统解决方案
随着科技的进步,物联网技术作为新一代信息技术的核心部分,正在深刻改变各行业的生产和管理方式。其在资产管理、智慧城市、能源管理和智慧医疗等多个领域的广泛应用,不仅提高了运营效率,还促进了资源优化配置和精细化管理。本文详细介绍了物联网的基础概念及其在设备精细化管理系统中的具体应用方案,展示了如何通过智能感知层建设、数据处理分析平台以及精细化管理应用,实现设备的实时监控、预测性维护和能耗管理等功能,从而帮助企业提升竞争力,降低成本,并推动社会向更智能化、绿色化的方向发展。
78 2
物联网设备精细化管理系统解决方案
|
29天前
|
存储 监控 物联网
医疗物联网设备精细化管理系统解决方案
华汇数据智慧医院物联网管理系统解决方案是一种集物联网、云计算、大数据和人工智能等先进技术于一体的综合性解决方案,旨在提升医院的运营效率、医疗质量和患者满意度。
67 3
|
1月前
|
SQL 缓存 Java
揭秘物联网性能优化的终极攻略!提升系统效率的七大法宝
小米在物联网项目中遇到了性能优化问题,他从数据库、集群、硬件、代码、并行处理、JVM及操作系统等多个层面分享了优化经验。包括SQL优化、分库分表、缓存使用、水平扩容、分布式调度、硬件升级、代码分析、并行处理、GC调优及操作系统参数调整等。小米强调性能优化需结合实际情况,逐步提升系统响应速度与稳定性。欢迎留言交流,共同进步。关注他的微信公众号“软件求生”,获取更多技术干货。
51 0
|
3月前
|
传感器 监控 安全
智能家居系统:物联网技术的应用与挑战
在这篇文章中,我们将深入探讨智能家居系统背后的技术原理、实际应用以及面临的主要挑战。通过分析物联网技术如何实现家居自动化,并结合具体案例,本文旨在提供对智能家居发展现状和未来趋势的全面理解。
|
3月前
|
消息中间件 存储 传感器
RabbitMQ 在物联网 (IoT) 项目中的应用案例
【8月更文第28天】随着物联网技术的发展,越来越多的设备被连接到互联网上以收集和传输数据。这些设备可以是传感器、执行器或其他类型的硬件。为了有效地管理这些设备并处理它们产生的大量数据,需要一个可靠的消息传递系统。RabbitMQ 是一个流行的开源消息中间件,它提供了一种灵活的方式来处理和转发消息,非常适合用于物联网环境。
155 1
|
3月前
|
分布式计算 搜索推荐 物联网
大数据及AI典型场景实践问题之通过KafKa+OTS+MaxCompute完成物联网系统技术重构如何解决
大数据及AI典型场景实践问题之通过KafKa+OTS+MaxCompute完成物联网系统技术重构如何解决
|
3月前
|
网络协议 物联网 Java

热门文章

最新文章