NXP i.MX 8M Mini视频开发案例分享 (上)
本文主要介绍i.MX 8M Mini的视频开发案例,包含基于GStreamer的视频采集、编解码、算法处理、显示以及存储案例,GigE工业相机测试说明,H.265视频硬件解码功能演示说明等。
注:本案例评估版采用的是创龙科技TLIMX8-EVM,它是基于NXP i.MX 8M Mini的四核ARM Cortex-A53 + 单核ARM Cortex-M4异构多核处理器设计的高性能评估板,
由核心板和评估底板组成。ARM Cortex-A53(64-bit)主处理单元主频高达1.6GHz,ARM Cortex-M4实时处理单元主频高达400MHz。处理器采用14nm最新工艺,支持1080P60 H.264视频硬件编解码、1080P60 H.265视频硬件解码、GPU图形加速器。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。正面外观如下图:

评估板文件系统默认已支持GStreamer库,可执行如下命令查看GStreamer库使用说明。
Target# gst-inspect-1.0 -h
GStreamer是用来构建流媒体应用的开源多媒体框架,其目标是要简化音视频应用程序的开发,目前可被用于处理MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime等多种格式的多媒体数据。GStreamer开发参考链接:https://gstreamer.freedesktop.org/documentation/?gi-language=c。
案例适用的模块如下表:
表 1
|
案例名称 |
适用模块 |
|
gst_mjpeg_dec_cv_edge |
中惠ZH5640-MIC-001 (USB OV5640摄像头) |
|
gst_rtsp_dec_display |
海康威视DS-IPC-B12HV2-IA (网络摄像头) |
|
gige_capture |
Basler acA720-290gm (GigE工业相机) |
1.gst_mjpeg_dec_cv_edge案例
1.1 案例说明
本案例使用GStreamer API通过ARM Cotrex-A53从USB摄像头获取MJPEG格式视频流并进行软件解码,然后使用OpenCV对图像进行Sobel(边缘检测)算法处理,再将经过处理的图像在显示屏中实时显示。
程序工作流程框图如下所示:

图 2
本案例使用的OpenCV版本为4.4.0,OpenCV开发参考文档:https://docs.opencv.org/4.4.0。
1.2 案例测试
请按照下图进行硬件连接,将USB OV5640摄像头(中惠ZH5640-MIC-001)连接至评估板USB2 HOST接口,将HDMI显示屏连接至评估板HDMI OUT接口。

图 3
开发案例位于产品资料“4-软件资料\Demo\video-demos\”目录下,将案例bin目录下的gst_mjpeg_dec_cv_edge文件拷贝至评估板文件系统中。评估板上电并进入文件系统后,可执行如下命令查询摄像头的帧率、分辨率、设备节点等参数。
Target# gst-device-monitor-1.0

图 4
在gst_mjpeg_dec_cv_edge文件所在路径下,执行如下命令查询gst_mjpeg_dec_cv_edge程序参数说明,具体如下表。
Target# ./gst_mjpeg_dec_cv_edge --help

图 5
执行如下命令采集"/dev/video1"设备节点的视频流,视频流将在Cortex-A53中进行Sobel算法处理,再将经过处理的图像在显示屏中实时显示。
Target#systemctl start weston@root.service //打开Weston界面
Target#./gst_mjpeg_dec_cv_edge -d /dev/video1 -w 1920 -h 1080 -f 15

图 6
表 2
|
参数 |
解析 |
|
Image width、Image height |
摄像头采集分辨率大小 |
|
Duration |
采集持续时间 |
|
Sobel cost time |
图像边缘处理平均时间 |
|
Capture framerate |
图像采集帧率 |
|
Sobel framerate |
图像边缘处理帧率 |
从打印结果可看到图像处理平均耗时约为52.57ms,图像采集帧率为15fps,图像处理帧率为15fps。
备注:
(1) 图像边缘处理平均时间,指调用OpenCV Sobel算法进行边缘检测的耗时。
(2) 计算图像边缘处理帧率时使用的总时间,包含从Gstreamer队列获取数据进行边缘检测、传输数据到Gstreamer队列的所有耗时。
本案例使用Sobel算法处理效果图如下所示。

图 7
本案例使用Cortex-A53进行图像采集、软件解码和算法处理,本次测试CPU占用率为120%,如下图所示。
备注:i.MX 8M Mini有4个Cortex-A53核心,CPU占用率最高可达400%。

图 8
1.3 案例解析
1.3.1 GStreamer管道示意图

图 9
管道命令示例如下。如下命令仅作示例,不能在终端直接运行。
Appsink:gst-launch-1.0 v4l2src device=/dev/video1 ! 'image/jpeg, width=1920, height=1080, framerate = 15/1' ! jpegdec ! appsink emit-signals=true, sync=false
Appsrc:gst-launch-1.0 appsrc ! 'video/x-raw, format=I420, width=1920, height=1080, framerate=15/1' ! stream-type=0, format=time ! imxvideoconvert_g2d ! autovideosink sync=false
1.3.2 关键代码说明
(1)初始化GStreamer,创建Pipeline。

图 10
(2)创建GStreamer组件并初始化,再检查组件初始化情况。

图 11
(3)配置各组件参数。

图 12
(4)链接组件至Pipeline。

图 13
(5)创建bus使应用程序能接收Pipeline消息,改变Pipeline状态为playing,使其开始工作。

图 14
(6)停止Pipeline。

图 15
(7)获取解码后的图像数据进行边缘检测,若正在进行边缘检测,则丢弃这一帧。

图 16
(8)边缘检测线程(sobel_thread)中,通过OpenCV Sobel算法对图像数据进行边缘检测,并将经过处理的图像数据发送至appsrc Pipeline。

图 17
(9)时间线程(time_thread)中,以秒为单位,统计程序运行时间,输出图像处理平均时间、图像采集与处理帧率。

图 18

图 19
1.4 案例编译
将案例源码拷贝至Ubuntu工作目录,进入src源码目录,执行如下命令加载SDK环境变量。
Host# source /home/tronlong/SDK/environment-setup-aarch64-poky-linux

图 20
执行make命令进行编译。
Host#make

图 21
编译完成后,将在当前目录生成可执行文件gst_mjpeg_dec_cv_edge。

图 22
2 gst_rtsp_dec_display案例
2.1 案例说明
本案例使用GStreamer API通过Cotrex-A53从网络摄像头获取H.264格式视频流数据,然后通过VPU进行H.264视频硬件解码,再将解码的图像在显示屏中实时显示。
程序工作流程框图如下所示:

图 23
2.2 案例测试

图 24
请按照上图进行硬件连接,开发案例位于产品资料“4-软件资料\Demo\video-demos\”目录下,并将该案例bin目录下的gst_rtsp_dec_display可执行文件拷贝至评估板文件系统中。在gst_rtsp_dec_display文件所在路径下,执行如下命令查询程序参数说明,具体如下图。
Target#./gst_rtsp_dec_display --help

图 25
本案例使用的网络摄像头IP地址为192.168.0.178,请确保评估板和网络摄像头IP地址处于同一网段。

图 26
执行如下命令采集视频流数据,并将解码后的视频流数据在显示屏中实时显示。
Target# systemctl start weston@root.service//开启Weston
Target#./gst_rtsp_dec_display -u rtsp://admin:tl123456@192.168.0.178:554/h264/ch1/main/av_stream -w 1920 -h 1080 -f 25 -s 1//192.168.0.178为摄像头IP地址

图 27

图 28
本次测试CPU占用率为63.7%,如下图所示。
备注:i.MX 8M Mini有4个Cortex-A53核心,CPU占用率最高可达400%。

图 29
2.3 时延测试
时延测试方法:使用摄像头采集PC机显示屏的在线秒表图像。PC机显示画面与评估板显示画面的时间差,即为时延。进行多次测试,时延结果取其平均值。
表 3
|
序号 |
评估板画面显示 |
PC机画面显示 |
时延(ms) |
|
1 |
00:01:28.393 |
00:01:27.951 |
442 |
|
2 |
00:02:29.024 |
00:01:28.551 |
473 |
|
3 |
00:03:38.792 |
00:01:38.315 |
476 |
|
4 |
00:04:20.983 |
00:01:20.513 |
470 |
|
5 |
00:05:58.084 |
00:01:57.635 |
449 |
|
平均值 |
/ |
/ |
462 |
2.4 案例解析
2.4.1 GStreamer管道示意图

图 30
2.4.2 关键代码说明
(1)初始化Gstreamer,创建Pipeline。

图 31
(2) 创建GStreamer组件并初始化,再检查组件初始化情况。

图 32
(3) 配置各组件参数。

图 33
(4)链接组件至Pipeline。

图 34
(5) 创建bus使应用程序能接收Pipeline消息,改变Pipeline状态为playing,使其开始工作。

图 35
(6) 停止Pipeline。

图 36
2.5 案例编译
将案例源码拷贝至Ubuntu工作目录,进入src源码目录执行如下命令加载SDK环境变量。
Host# source /home/tronlong/SDK/environment-setup-aarch64-poky-linux

图 37
执行make命令进行编译。
Host# make

图 38
编译完成后,将在当前目录生成可执行文件gst_rtsp_dec_display。

图 39
如果你还想了解更多嵌入式应用的相关知识,欢迎关注Tronlong创龙科技~
NXP i.MX 8M Mini视频开发案例分享 (上)的更多相关文章
- 基于Flink的视频直播案例(上)
目录 数据产生 Logstash部分 Kafka部分 Flink部分 配置/准备代码 视频核心指标监控 本案例参考自阿里云的视频直播解决方案之视频核心指标监控和视频直播解决方案之直播数字化运营. 基于 ...
- 「含源码」关于NXP IMX8 Mini的图形开发指南(GPU)案例分享!
前言 Graphical Demo框架提供了对平台相关依赖的抽象.Graphical应用的通用封装,如模型加载.纹理加载.着色器编译等,以及其它一些通用的应用逻辑处理的封装,使得使用框架的开发人员(以 ...
- Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例
☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...
- WebRTC 音视频开发
WebRTC 音视频开发 webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...
- 知识图谱实战开发案例剖析-番外篇(1)- Neo4j是否支持按照边权重加粗和大数量展示
一.前言 本文是<知识图谱实战开发案例完全剖析>系列文章和网易云视频课程的番外篇,主要记录学员在知识图谱等相关内容的学习 过程中,提出的共性问题进行展开讨论.该部分内容原始内容记录在网易云 ...
- 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》
<实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明 辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...
- 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)
随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...
- VIP 视频开发板 上位机 测试软件 下载地址,玩转各自分辨率(V201抢先版)
本上位机最高测试帧率 133fps 目前支持分辨率:更多分辨率支持,敬请期待或给我留言VGA:640*4801.3M:1280*10242M:1600*1200786p:1024*768 格式兼容:1 ...
- 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇)
系列文章 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇) 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇) 前言 好久不见,很久没更新博客了,前段时间 ...
- Python音视频开发:消除抖音短视频Logo的图形化工具实现
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解>节介绍了怎么通过Python+Moviepy+OpenCV实现 ...
随机推荐
- gin返回json假数据
package main import ( "github.com/gin-gonic/gin" "encoding/json" "fmt" ...
- git学习--GitHub上如何进行PR(Pull Request)操作
目录 一.前言 二.实现步骤 2.1 将小红在GitHub上的Repository clone到小明的本地电脑 2.1.1 fork小红在GitHub上的Repository到小明的GitHub 2. ...
- WEB服务与NGINX(1)-HTTP协议基础
WEB服务与NGINX(1) 目录 WEB服务与NGINX(1) 1. HTTP协议 1.1 WEB资源 1.2 URI简介 1.3 WEB服务请求处理过程 1.4 HTTP报文结构 1.4.1 re ...
- Flutter 多线程实现
异步Isolate实现多线程 最近在看Flutter开发相关知识点,对照着Android原生,探究了下多线程实现方式.在Flutter中有 Isolate,隔离,它的实现原理并不是内存共享的,它更 ...
- P3193 [HNOI2008] GT考试 题解
之前学矩阵乘的时候做的题,当时因为不会\(kmp\)搜索一稀里糊涂过去了,现在填个坑. 头图 是\(Logos\)! P3193 [HNOI2008] GT考试 题链:洛谷 题库 题目大意: 求有多少 ...
- 免费考AI OCP认证,附通关秘籍!
这是一个能让你快速熟悉AI相关技能的考试,由Oracle官方提供,而且限时免费. 它就是OCI Generative AI Professional. 可以看到,目前免费政策正在执行,到今年的7月31 ...
- 使用Newtonsoft.Json进行Json与XML相互转换
XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析好像没啥难度.今天突然发现Newtonsoft.Json中有关于Json和XML互转的方法,所以顺带记录总结一下. 一.关于Newtons ...
- 最好的在线PDF转换工具服务
工作中有时候会碰到需要转换PDF文件的情况,现在网上就要很多免费的在线工具,可以进行PDF文件的转换,下面就来介绍一些可以直接在浏览器中将文档.电子表格.和图片转换为PDF或者互相转换的服务工具. ...
- Bi-encoder vs Cross encoder?
本文永久地址:https://wanger-sjtu.github.io/encoder-cross-bi/ Bi-encoder和Cross-encoder是在自然语言理解任务模型的两种不同方法,在 ...
- TIM_Cmd()函数引发的思考
在使用定时器的输入捕获进行频率测量时发现用TIM_Cmd()函数关闭定时器后,输入捕获中断还是会被触发,这就很奇怪了,输入捕获是定时器的一种模式,关闭定时器不就意味着输入捕获捕获也被关闭了吗?可是实际 ...