ESM8000主板视频图像显示方案简介

 2021-11-3 14:20:44     作者:黄志超    

1、概述


  英创公司推出的ESM8000主板搭载了NXP i.MX8M Mini Quad 64位处理器,主CPU为主频1.6GHz的四核ARM Cortex-A53,并且带有一个视频处理单元(VPU),能够提供硬件解码和编码的功能,解码支持的格式有1080p60 HEVC/H.265,H.264,VP9,VP8等,编码支持的格式有1080p60 H.264,VP8等。对视频编解码有一定需求的应用,最好选择带有VPU的主板进行开发。因为在没有VPU的情况下,CPU只能通过软件计算来进行编解码,效率很低并且会占用大量CPU资源,而通过VPU来编解码能够极大的节约CPU资源,并且处理的速度也比CPU快很多。


  在ESM8000主板中,已经集成了Qt-5.15,用户可以通过Qt来实现用户图形界面的开发,这部分我们已经在《ESM8000主板图形界面编程简介》中比较详细的介绍过了,文章在最后提到了如果要想调用VPU进行解码,就需要通过QML界面或者Gstreamer工具。在ESM8000主板中已经集成了Gstreamer工具和一些专用插件,这些插件就提供了使用VPU进行编解码的功能。为了支持在Qt中调用Gstreamer工具实现视频的处理,ESM8000主板中移植了专用插件qmlsink,用户无需进行特殊的设置或者操作,使用标准的QML语言编程即可,当涉及到视频处理的部分,系统就会自动通过Gstreamer的插件调用vpu来处理视频。


  所以对于熟悉QML的用户来说,可以在ESM8000主板上直接采用标准的qml语言编程来实现应用,不需要其他特殊设置,十分方便。对于QML不太熟悉的用户来说,英创公司提供了一个基于QML语言实现的视频显示界面,用户可以通过在传统Qt C++的实现的窗口中嵌入这个现成的界面来实现对应的功能。我们想通过这种方式,让客户还是可以使用熟悉的Qt C++环境来编程,而不必花费更多的时间去学习QML语言的使用。下面我们以显示网络摄像头监控画面为例,来讲解如何调用现成的QML界面。


2、Qt C++调用QML实现视频显示


  英创公司提供一个现成的基于QML语言实现的视频显示界面ipcamera1.qml,这个界面可以显示本地视频或者网络摄像头的画面。方案的核心就是利用了Qt提供的quickWidget类来嵌入QML界面,这个widget类专门用于显示Qt Quick(Qt提供支持QML语言的库以及函数)用户界面。在Qt的官方网站中对quickWidget有详细的说明https://doc.qt.io/qt-5/qquickwidget.html,有兴趣的客户可以参考。


  首先在创建的工程中导入英创公司提供的视频显示界面ipcamera1.qml,在这里我们选择导入到Qt Resource中。右键工程选择添加新文件,在模板中选择Qt Resource File,单击下一步,然后输入名称,例程中输入的名称为qml。可参考下图:


ESM8000主板视频图像显示方案简介.png


  成功后,会自动生成一个qml.qrc文件,这时需要进行初始设置,并添加视频显示界面ipcamera1.qml。首先点击添加按钮,选择添加前缀,在前缀中输入想设置的路径(在引用资源的时候会使用到),例程中设置为/,如下图:


ESM8000主板视频图像显示方案简介.png


  设置完后,再次点击添加按钮,选择添加文件,在文件浏览框中选中复制到工程目录下的ipcamera1.qml文件,成功后可以在qml.qrc的浏览窗中看到对应的文件,如下图:


ESM8000主板视频图像显示方案简介.png


  导入QML文件的部分就已经完成了,用户只需要在程序中增加对quickWidget的初始化即可,可参考下面的代码:


w = new QQuickWidget;  
w->move(0,0);  
w->resize(640, 360);  
w->setSource(QUrl(("qrc:/ipcamera1.qml")));

 

  如果需要和QML界面中的内容进行交互,可以通过信号与槽来实现。Qt C++中发送信号,在QML界面中定义槽函数响应,或是在QML界面中发送信号,在Qt C++中定义槽函数来响应都是可以的。例程中实现了一些按钮,对QML界面进行简单的操作,比如开始、停止等功能。在Qt的网站上也有比较详细的说明:https://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html。在英创公司提供的例程中,加入了开始、停止、缩放、旋转以及切换清晰度等操作,都是通过界面上C++的控件类(pushButton、comoBox等)发送信号来实现的,具体可以参考例程中的代码。


  例程采用了比较常用的网络摄像头,测试效果如下:


ESM8000主板视频图像显示方案简介.png


3、总结


  从程序的截图中可以看出来,在使用VPU解码的情况下,几乎不会对CPU造成负载,用户可以利用CPU资源执行其他操作。


  通过这种方式,我们希望让用户不必花过多时间对QML语言编程进行学习,以此能够帮助用户提升应用程序开发的时间。感兴趣的客户可以和英创的工程师联系获取完整的测试代码。