【ATU Book-i.MX8系列 - eIQ NNStreamer】GStreamer 快速使用介绍

一.   概述

此篇文章为 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

视讯解码至 V4L2 API 的相关插件,如下 :



(2) Video Encoder Plugins

视讯编码至 V4L2 API 的相关插件,如下 : 



(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) 作影像串流解码 !! 一起动手探讨吧!!

 必要环境 : 



 视频处理单元(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
 !!

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论