一. 概述
此篇文章为 eIQ 系列的延伸应用,相信各位已经对于 NXP 所开发的 eIQ 机器学习开发环境 有一定程度上的认识了 !! 若尚未理解的伙伴,请点选上述连结温习一下 !! 所谓的 eIQ NNStreamer 是利用 GStreamer 插件的方式,让用户可以快速实现机器学习的一种应用方式。为了加深 NNStreamer 与 GStreamer 差异与用法,本系列会简单探讨 GStreamer 的应用方式 ; 并利用 NXP i.MX8M Plus并搭配一台 WebCAM (I-family If008D) 来完成实作。
如下图文章架构图所示,本系列是隶属于 机器学习开发环境 eIQ 之 应用层 (Application Layer) 中,本篇将介绍“GStreamer 快速使用介绍”。
若新读者欲理解更多人工智能、机器学习以及深度学习的资讯,可点选查阅下方博文
大大通精彩博文 【ATU Book-i.MX8系列】博文索引
eIQ NNStreamer 系列博文-文章架构示意图
二. GStreamer 介绍
GStreamer 是一个跨平台的多媒体框架。工程师可以透过此框架达成各种多媒体应用,比如音讯回放、影片播放、串流媒体、镜头解析等等,并支援多种 Windows、Linux、Android、IOS 等热门作业系统。
其设计理念是以 管道(Pipeline) 的方式来对每一个 元素(Element) 或 插件(Plugins) 进行串联 ; 如下图所述,若要透过 GStreamer 来解析一个 视频档案(mp4) 的话,基本的动作流程就是载入档案、解析档案、再分别解析音讯与视讯,最后将资讯传送至 autoaudiosink 之中,就可以播放视频了 !! 这整个流程就是所谓的 Pipeline 概念,以一种流水方式,一项接一项的进行操作 ; 其中浅蓝色的区块称作元素(Element),通常是指一项动作或一个功能。而深蓝色的区块是称作 Pad ,泛指一个接口的意思 ; 且接收端称作 sink ,发送端称作 src 。
GStreamer Pipeline示意图
原始出处 : 什么是Gstreamer?
GStreamer Pipeline 的实现方式相当直觉 !! 仅需要开启终端机输入下方的 Command Line 即可实现 !!
$ gst-launch-1.0 filesrc location=<mp4> ! \
oggdemux name=demux ! queue ! vorbisdec ! autoaudiosink \
demux. ! queue ! theoradec ! videoconvert ! autovideosink
PS : oggdemux 已被命名为 demux ,后续直接用此名引用即可。
再来,可以快速地探讨一下 GStreamer 是如何沟通的。如下图所示,可以看出 Bus 提供了许多数据传递的方式,像是由元素向应用程式发出消息,就称作 Messages,或是从应用程式向元素发出消息,就称作 Events 。其中 events 与 quries 的差异是取得讯息的不同,而后者是属于像查询时间、文件大小等这类资讯。
GStreamer Pipeline 应用之示意图
原始出处 : 什么是Gstreamer?
然而, GStreamer 是一套具有丰富资源的框架(Framework),能够提供数种 插件(Plugins)、工具(Tool)、应用程式(Media Application) 等丰富资源提供给工程师使用。其中最基础就是各种插件的应用,也就是上述所提及的,读取档案的 filesrc 或是解析档案的 oggdemuxer 皆属于插件的一种。 如下图所示,插件大致上可以分为六种类型 ; 依序为 协定(Protocols) 、 来源(Sources) 、格式(Formats) 、 解编码(Codecs) 、 输出(Sink) 、 滤波器(Filter) 等等。
GStreamer 框架示意图
三. GStreamer 插件
因 GStreamer 提供插件过于丰富,以下列出几个比较常用的 Plugins 介绍 …. 其中表格中的 Package 是指插件的所应用的资料库。
(1) Video Decoder Plugins
(2) Video Encoder Plugins
(3) Video Sink Plugins
(4) Demux Plugins
视讯解码至 raw 格式的相关插件,如下 :
(5) Mux Plugins
从 raw 格式编码至其他影音格式的相关插件,如下 :
(6) i.MX Proprietary Plugins
NXP 所提供的相关插件,包含 VPU 的解码与编码、以及 GPU 的转换格式之应用 :
(7) Audio Plugins
声音与音讯相关的插件,如下 :
(8) Image Plugins
影像格式相关的插件,如下 :
(9) Network Plugins
网路相关的插件,如下 :
四. 透过 GStreamer 启用网路摄像头(WebCAM)
(1) 测试环境
目前使用 WPI 所研发的 OP-Killer 开发板 (NXP i.MX8M Plus) 并搭配一台 WebCAM (I-family If008D) 进行实际测试。
本篇文章将带领读者操作 GStreamer 的指令来解析网路摄像头中的 YUV 与 H264 格式,并应用 i.MX8 独有的硬体加速芯片 VPU( Video Processing Units) 作影像串流解码 !! 一起动手探讨吧!!
必要环境 :
- OP-Killer EVM 或 NXP i.MX8M Plus 开发板 x 1
- UVC / WebCAM x 1
- Screen X 1
视频处理单元(VPU) 规格 :
(2) 检查装置
请先确认 装置(Device) 或 网路摄像头(Webcam) 是否正确连接至开发板。
代码展示 :
$ v4l2-ctl --list-devices
执行结果展示 :
(3) 检查装置规格
请先确认 装置(Device) 或 网路摄像头(Webcam) 的规格。
代码展示 :
$ v4l2-ctl -d /dev/video{*} --list-formats-ext
执行结果展示 :
如下图所示,此装置有三种规格 ; 分别为 MJPG \ H264 \ YUYV。
(4) 检查是否支援 VPU
请列用下列代码,来检查确认平台端是否有支援 VPU Encoder / Decoder。
代码展示 :
$ gst-inspect-1.0 | grep -ie vpu -ie gpu -ie dec
执行结果展示 :
(5) 使用 GStreamer 驱动网路摄像头
1. 快速启用
实测结果展示(任选一行指令) :
$ gst-launch-1.0 v4l2src device=/dev/video3 ! waylandsink
2. 解析 YUV 格式
请观察以下两种分辨率所对应的 FPS 祯数,分别为 1280x720 与 640x480 。此次实测结果,可以发现 640x480 的分辨率能够来到 FPS 祯数约 24 张的表现。远大于前者的表现,因此对于用 CPU 运行来解码而言,由此可证 ; 在处理 640x480 的分辨率时,会呈现较好地性能表现。
实测结果展示( 1280x720 ) :
$ gst-launch-1.0 v4l2src device=/dev/video3 ! \
'video/x-raw,format=YUY2,width=1280,height=720,pixel-aspect-ratio=1/1,framerate=30/1' ! fpsdisplaysink
实测结果展示( 640x480 ) :
$ gst-launch-1.0 v4l2src device=/dev/video3 ! \
'video/x-raw,format=YUY2,width=640,height=480,pixel-aspect-ratio=1/1,framerate=30/1' ! fpsdisplaysink
3. 解析264 格式
请观察以下三种分辨率所对应的 FPS 祯数,分别为 1920x1080、1280x720、640x480 。
从实测结果可以发现 1920x1080 的分辨率能够达到 FPS 祯数约 24 张的表现。720p 的分辨率仍保有 15 张的表现,则 480p 的分辨率剩下仅仅 6 张的表现。但因作者尚未熟读 VPU 的硬体架构,目前仅能实验的数据来作参考,故借由 VPU 硬体来作视讯解码的方式,在处理 1920x1080 的分辨率时,会呈现较好地性能表现。
实测结果展示( 640x480 ) :
$ gst-launch-1.0 v4l2src device=/dev/video3 -v ! \
'video/x-h264, width=640, height=480, pixel-aspect-ratio=1/1, framerate=30/1' ! \
queue ! h264parse ! vpudec ! queue ! imxvideoconvert_g2d ! queue ! fpsdisplaysink
# 选项 -v 可以显示 log 资讯至终端机上
实测结果展示( 1280x720 ) :
$ gst-launch-1.0 v4l2src device=/dev/video3 -v ! \
'video/x-h264, width=1280, height=720, pixel-aspect-ratio=1/1, framerate=30/1' ! \
queue ! h264parse ! vpudec ! queue ! imxvideoconvert_g2d ! queue ! fpsdisplaysink
实测结果展示( 1920x1080 ) :
$ gst-launch-1.0 v4l2src device=/dev/video3 -v ! \
'video/x-h264, width=1920, height=1080, pixel-aspect-ratio=1/1, framerate=30/1' ! \
queue ! h264parse ! vpudec ! queue ! imxvideoconvert_g2d ! queue ! fpsdisplaysink
PS : 此摄像头虽有支援分辨率 2560x1440 的格式,但执行平台端中会有资料流的错误讯息。导致无法顺利运行。
五. 结语
根据上述实验得知,能透过 GStreamer Framework 或 Pipeline 指令操作来改善网路摄像头或 MIPI 摄像头的每帧处理速度。此文章以 OP-Killer EVM 开发板搭配 I-Family IF-008D 摄像头来验证透过 GStreamer 在 YUV 与 H.264 的处理速度。其中发现由 CPU 软体解码的 YUV 格式,效能表现是远慢于透过 VPU 解码的 H.264 格式的表现,且可以达到分辨率 1920x1080@fps 25 的不错成绩。若有兴趣的读者能更加钻研 GStreamer 的应用,对于影像串流、影音处理都是必学习的一堂课 !! 接下来,就要将 GStreamer 的概念结合至 eIQ NNStreamer 中,敬请期待下一篇博文 !!
六. 参考文件
[1] 官方文件 - i.MX8 GStreamer User Guide
[2] 第三方资源 - GStreamer 维基百科
[3] 第三方资源 - 什么是Gstreamer?
如有任何相关 eIQ NNStreamer 技术问题,欢迎至博文底下留言提问 !!
接下来还会分享更多 eIQ NNStreamer 的技术文章 !!敬请期待 【ATU Book-i.MX8 系列 - eIQ NNStreamer】 !!
评论