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

 

 
图 1

 

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创龙科技~

posted @ 2023-06-05 15:18  创龙科技-黄工  阅读(105)  评论(0编辑  收藏  举报