ESM6802是英创公司推出的基于Freescale i.MX6DL双核处理器(ARM Cortex-A9,主频1GHz)的高性能工控主板,imx6dl内部包含一个视频处理模块(VPU)可以支持多种视频格式的编解码,而开发板预装的Linux系统也提供了gstreamer以及Qt 5.8来给视频处理应用程序提供便捷的函数接口。本文将简单介绍VPU硬件模块以及gsteamer多媒体编程框架和Qt 5.8的多媒体处理模块。
1、多媒体文件简单介绍
多媒体文件通常有文件后缀如mp4、mkv等。这些后缀表明的是多媒体文件的container格式,也就是视频数据、音频数据、字幕数据的封装在一个文件中的封装格式。而视频数据、音频数据又有自己的编码格式,如视频常用的H264、MPEG4等以及音频常用的AC3、MP3等。编码格式才是不同多媒体文件之间的本质区别所在,在处理相关多媒体文件时必须有相应的编解码器才能进行。不同的编码能够提供不同的数据压缩水平以及数据恢复的质量,关于各种编码标准以及文件封装格式的详细信息用户可以自行查看相关资料,我们建议用户在使用中尽量使用H264编码的视频数据。
2、硬件资源介绍
imx6dl内部集成了一个高性能的、支持多种编解码格式的视频处理模块(VPU),支持最高1920x1080 60i或者30p分辨率的解码以及1920x1088分辨率的视频编码,使用VPU来处理视频不占用CPU资源,而且处理速度更快,在实际使用中应该尽量优化应用程序使用VPU来处理视频编解码相关操作。
VPU能够解码的视频格式为:
● H.264 BP/MP/HP
● VC-1 SP/MP/AP
● MPEG-4 SP/ASP (不包括GMC)
● DivX(Xvid)
● MPEG-1/2
● VP8
● AVS
● MJPEG
VPU支持的编码格式为:
● H.264
● MPEG-4
● H.263
● MJPG
关于支持的编解码格式的详细说明请参考后面Qt章节的详细列表或者文档《i.MX VPU Application Programming Interface Linux Reference Manual》,我们在此不再详细说明。
VPU提供了一套函数接口供程序调用,程序调用这些API函数向VPU发送命令以及相应的参数来达到控制VPU编解码的运行。由于Linux系统下面的视频处理编程框架有更加高级的gstreamer,而且imx6dl也提供了相应的gstreamer插件来使用VPU资源,我们不再详细介绍VPU提供的低级API函数,也不推荐用户使用这套API,不过有兴趣的用户可以自行参考《i.MX VPU Application Programming Interface Linux Reference Manual》。
3、GStreamer介绍
GStreamer是目前常用的流媒体处理编程框架,GStreamer提供一种基于插件的编程框架,他的核心部分只提供了支持框架之间的数据流、媒体格式的协商等基础功能,而对于流媒体的编解码以及流媒体内容的获取(如摄像头、网络、本地文件)等功能都由插件提供。在编程时可以将插件进行连接组合成一条流媒体处理流水线(pipeline),当流水线工作时,流媒体内容从第一个插件元素(element)一直流动到最后一个,各个插件元素完成自己的功能从而实现流媒体的处理。一个简单的ogg视频播放流水线示例如下图所示:
一个流水线内的元素包含了数据处理接口(pad),pad根据数据的流向又分为source pad和sink pad,如上图所示,source pad是生成数据的接口,而sink pad是接收数据的接口。每个接口都有自己能够接收或产生的数据格式的限制,称为cap capabilities,这些限制可以使用命令行工具gst-inspect-1.0进行查看,使用方法为:
gst-inspect-1.0 [选项...] [ELEMENT-NAME | PLUGIN-NAME]
如查看v4l2src,v4l2src是用于从摄像头采集数据的元素,命令输出部分结果如下:
上图中可以看到v4l2src有一个source pad,可以生成image/jpeg、video/mpeg、video/x-h264等格式的数据,在构建GStreamer流水线时,只有当两个元素的src pad和sink pad能够处理相同格式的数据时,才能将这两个元素连接起来。而对于像v4l2src这类的数据生成的元素,其支持的数据格式和最终能够产生的数据格式是不一样的,能够产生的数据格式是所支持的数据格式的一部分,受到摄像头硬件的限制,比如常见的USB摄像头只支持生成YUY2\jpeg格式,则使用此摄像头的v4l2src元素也就只能产生这两中格式的数据,在编程时要特别注意这点,避免错误的连接元素。
更多GStreamer基础知识请用户详细阅读GStreamer官网上的编程参考手册或其他相关知识,我们下面将介绍imx6dl所提供的特有的插件。
基于imx6dl内部视频处理模块VPU的GStreamer插件包括:
● vpudec: 基于VPU的视频解码插件
● vpuenc_h264: 基于VPU的AVC/H264视频编码插件
● vpuenc_h263: 基于VPU的H263视频编码插件
● vpuenc_mpeg4: 基于VPU的MPEG4视频编码插件
● vpuenc_jpeg: 基于VPU的JPEG视频编码插件
上面模块的编解码格式详细信息可以参考上一章VPU的介绍。
基于其他硬件模块的插件包括:
● overlaysink: 基于2D图形处理模块G2D的视频输出插件
● imxvideoconvert_g2d: 基于G2D的视频图像转换模块,包括图像颜色空间转换、改变大小、旋转
● imxvideoconvert_ipu: 基于图像处理模块ipu的图像转换模块
● imxcompositor_g2d: 基于G2D的视频编排模块
● imxcompositor_ipu: 基于IPU的视频编排模块,视频合成模块可以将多个视频编排成一个,并且编排同时支持颜色空间转换、改变大小、旋转、alpha(透明度)、z-order(用于图像重叠)。
这些插件在处理数据时都不会占用CPU资源,并且能提供高性能的数据处理,建议用户在应用程序中优先使用这些插件。每个插件都有支持的数据格式限制,用户可以使用gst-inspect-1.0命令进行查看,限于篇幅我们只展示vpuenc_h264的部分输出如下:
从输出可知,vpuenc_h264支持video/x-raw格式的视频输入,而且限制为NV12、I420、YV12颜色模式,以及分辨率为宽64~1920、长64~1088,帧率从每秒0帧到每秒2147483647帧,如果要使用vpuenc_h264进行视频文件编码,则前一级的GStreamer流水线元素必须提供限制内的数据格式,否则将无法正确编码,程序运行出错。用户在使用GStreamer插件之前需要先确认其支持的数据格式以及之前插件提供的输入的数据格式是否匹配,以免程序不能正常运行。
除了单独使用插件外,GStreamer还提供高级元素,元素内部自动识别文件格式调用相应的插件来完成数据处理,比如playbin、decodebin、camerabin等,这些元素能够自动使用上面所说的特定硬件的插件。这些元素能够简化程序的开发,但是程序也就不能详细配置某个特定的插件的属性了,程序少了灵活性,更多相关内容请自行参考GStreamer相关文档。
4、Qt 5.8多媒体处理模块
ESM6802文件系统已经移植了Qt 5.8,Qt的多媒体处理模块是基于GStreamer框架搭建的,用户在编写程序时可以调用Qt提供的API来进行视频处理,这样就可以在使用硬件资源(VPU、IPU、G2D等)的同时简化程序的复杂程度(不用自行搭建GStreamer流水线)。
关于Qt视频播放的介绍请参考我们官网的文章《ESM6802支持基于Qt的视频播放》。
关于Qt摄像头的程序请参考我们官网的文章《ESM6802支持Qt摄像头应用》。
由于Qt内部多用playbin、camerabin等高级元素来构建视频应用,应用灵活性有限,为了使程序能正确运行以及提高视频数据处理性能,对输入数据格式有一定限制。由之前两章的介绍可知,imx6dl硬件资源能够处理的多媒体格式是有限制的,在使用Qt进行视频播放时需要满足这些限制才能正确的使用特定的硬件资源,而不占用CPU资源,对于视频播放(解码)的限制格式如下:
• H.264
• Fully compatible with the ITU-T Recommendation H.264 specification in BP/MP and HP
• CABAC/CAVLC
• Supports MVC Stereo High profile
• Variable block size-16x16, 16x8, 8x16, 8x8, 8x4, 4x8 and 4x4
• Error detection, concealment and error resilience tools
• VC1
• All VC-1 profile features-SMPTE Proposed SMPTE Standard for Television: VC-1 Compressed Video Bitstream format and Decoding Process
• Simple/Main/Advanced Profile
• MPEG-4
• Simple/Advanced Simple profile except GMC
• H.263 Baseline profile + Annex I, J, K (except RS/ASO), and T
• DivX version 3.x to 6.x
• Xvid
• MPEG-2
• Fully compatible with ISO/IEC 13182-2 MPEG2 specification in main profile
• I,P and B frame
• Field coded picture (interlaced) and fame coded picture
• AVS
• Supports Jizhun profile level 6.2 (exclude 422 use case)
• VP8
• Fully compatible with VP8 decoder specification
• Supporting both simple and normal in-loop deblocking
• 64x64 pixel minimum decoding size
对于摄像头应用,支持的编码输出格式为:
• H.264
• 1/4-pel accuracy motion estimation with programmable search range up to [+/-128, +/-64]
• Search range is reconfigurable by SW
• 16x16, 16x8, 8x16 and 8x8 block sizes
• Configurable block sizes
• Only one reference frame for motion estimation
• Intra-prediction
• Luma I4x4 Mode : 9 modes
• Luma I16x16 Mode : 3 modes (Vertical, Horizon, DC)
• Chroma Mode : 3 modes (Vertical, Horizon, DC)
• Minimum encoding image size is 96 pixels in horizontal and 16 pixels in vertical
• FMO/ASO tool of H.264 is not supported
• MPEG-4
• AC/DC prediction
• 1/2-pel accuracy motion estimation with search range up to [+/-128, +/-64]
• Search range is reconfigurable by SW
• H.263
• H.263 Baseline profile + Annex J, K (RS=0 and ASO=0), and T
• 48x32 pixel minimum encoding image size (48 pixels horizontal and 32 pixels vertical)
而要使用这些硬件编码资源还需要摄像头输入数据满足如下格式:
video/x-raw
format: { NV12, I420, YV12 }
width: [ 64, 1920, 8 ]
height: [ 64, 1088, 8 ]
framerate: [ 0/1, 2147483647/1 ]
如果不能满足以上格式要求,Qt内部调用的GStreamer高级元素有可能会选取软件编解码插件来进行视频的处理,这样整个处理过程会占用大量的CPU资源,也有可能内部协商出错,不能正常处理视频,因此用户最好在编写应用时提供满足上面介绍的格式的视频数据。购买摄像头时尽量选择能够直接输出NV12、I420、YV12格式的摄像头,其他格式则需要自己构建GStreamer pipeline先进行数据格式的转换,Qt内部使用的camerabin不能正确处理这些。
更多视频处理相关的内容请关注我们后续的文章。
成都英创信息技术有限公司 028-8618 0660