Linux主板多通道视频采集方案

 2019-6-20 15:51:46     作者:黄志超    
文章标签:Qt视频

  英创公司推出的ESM7100主板搭载了I.MX7DL处理器,这款处理器是双核Cortex-A7架构,并且主频达到1GHz,不仅有着强劲的处理性能,还继承了Cortext-A7的低功耗特性,非常适用于工业应用。进一步,ESM7100的还配置高速PCIe接口,使其可满足工业视频监控对高速数据采集的需求。本文主要介绍基于英创公司ESM7100的多通道视频采集应用方案。


  ETA6869模块是英创公司开发的具有标准mini PCIe尺寸,最多能够支持8通道视频采集模块,核心芯片为视频解码芯片tw6869。ETA6869模块通过PCIe×1接口与ESM7100相连接,保证了数据的高速传输。标准的mini-PCIe尺寸模块的设计,可以让模块方便的嵌入在底板上,如下:


Linux主板多通道视频采集方案.png


  ESM7100主板已经预装了ETA6869模块的驱动,上电后驱动会自动加载,成功加载后在/dev目录下会生成video节点,通过操作video节点,就能够获取视频数据,通过ls命令就能够查看设备节点,如下图,/dev/vidoe0为ESM7100主板的显示输出设备节点,系统显示服务程序会调用这个设备节点,客户应当避免直接操作它,/dev/video1~/dev/video8就是生成的视频输入设备节点,分别代表视频输入的通道1-通道8:


Linux主板多通道视频采集方案.png

video节点


  在软件开发方面,ESM7100的文件系统中已经集成了gstreamer工具,这是一种跨平台的多媒体框架工具,而整个框架是基于模块化设计的,在框架中将提供不同功能的模块插件集合起来,就能够实现所需求的多媒体应用功能。关于gstreamer的资料在官网中有非常详细的文档介绍以及例程参考,这里就不再赘述,有兴趣的客户可以查看:https://gstreamer.freedesktop.org/documentation/index.html?gi-language=c了解详情。通过gstreamer可以方便快捷的处理视频数据,同时ESM7100板载了Qt5.8,能够使用Qt实现界面的设计,然后与gstreamer配合,让gstreamer将视频数据输出到Qt窗口控件上,采用这种方法就能够让整个多通道视频采集方案快速实现。


  考虑到部分客户可能对gstreamer不熟悉,英创公司在gstreamer提供的API函数基础上重新封装了一层,通过库文件libemgst.so提供三个简单的API函数,利用这三个API函数,客户就可以将视频数据显示在Qt实现的界面上,而不需要使用代码对gstreamer单独进行操作,客户可以专注于Qt程序的开发。下面就详细介绍libemgst.so的三个API函数:



/**

 *    初始化gstreamer

*

*    本函数在C的main函数中调用,将会初始化gstreamer库

*

*    参数说明:

*    使用main函数的两个参数填入,gstramer初始化时需要读取main函数的两个参数

*

*      返回值说明:

*    无返回值

*

 */

void init_emgst(int argc, char **argv);

 

/**

 *    配置gstreamer,并显示到指定Qt窗口

*

*    函数会配置gstreamer,显示多个通道的视频到xwinid所指定的窗口,窗口的大小通过

*    参数width和height来确定,而视频的设备节点由指针devlist传入,listsize指定同时显示

*    的通道数量

*

*    参数说明:

*  xwinid:Qt窗口的id号,每一个窗口类中都包含这个成员变量。

*    width:显示视频数据所使用的窗口控件的宽度,单位pixel

*    height:显示视频数据所使用的窗口控件的高度,单位pixel

*devlist:指向设备列表的指针,通常是一个包含设备号的数组,比如需要显示

*    /dev/video1和/dev/video2,那么devlist就应该指向一个长度为2的数组,其中

*    devlist[0]=1,devlist[1]=2

*  listsize:显示的视频通道数。支持1,2,4,6,8这五个值,函数会按照固定模式对显

*    示进行排列

*

 *    返回值说明:

*    0表示正常启动gstreamer

*  -1 表示填入参数出现错误,启动gstreamer失败

*

 */

  int config_emgst(unsignedint xwinid, int width,int height, char *devlist, int listsize);

 

/**

*    关闭gstreamer,释放资源

*

*    函数会关闭gstreamer输出,并释放相关资源

*

*    返回值说明:

*    无返回值

*

*/

void release_emgst(void);


  init_emgst函数进行gstreamer的初始化,在启动gstreamer功能之前需要调用一次,客户配合Qt使用时在main函数中调用即可:



int main(intargc, char *argv[])

{

        //初始化英创主板gstreamer功能

        init_emgst(argc, argv);

                   

        //Qt窗口初始化,由QtCreator自动生成

        QApplicationa(argc, argv);

        MainWindow w;

        w.show();

 

        returna.exec();


  config_emgst函数会配置并启动gstreamer,客户只要得到用来显示视频的窗口控件的id就可以了,在每一个Qt窗口控件类中都有对应的成员变量,可以很简单的获取到。config_emgst函数会根据width和height的值自动分配显示区域。通过devlist可以设置需要操作的设备节点索引号,listsize指定同时显示的通道数,支持的值为1、2、4、6、8,显示的方式如下图:


Linux主板多通道视频采集方案.png

视频数据显示排列方式


  函数调用后gstreamer会将对应通道数的视频显示在指定的Qt窗口控件中,每一个区域所显示的视频数据是通过指针devlist指定的,下面是部分参考代码,将graphicsView控件的id传给gstreamer,并显示/dev/video1的数据:



MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

       ui->setupUi(this);

      

  //初始化设备列表

       devlist = (char*)malloc(sizeof(char));

       devlist[0] = 1;

 

       //获取窗口控件id,并赋值给成员变量xwinid

       xwinid = ui->graphicsView->winId();

 

       //将参数传入函数中初始化gstreamer,并开始输出视频数据

       config_emgst(xwinid, 640, 480, devlist, 1);

}


  release_emgst函数会停止gstreamer输出,并释放资源,在程序退出或者需要切换显示的时候调用,下面的代码是通过检测Qt按钮控件的点击事件,实现切换显示通道数:



voidMainWindow::on_channel_4_released()

{

  //初始化设备列表,填入四个通道的值

  devlist = (char *)malloc(4*sizeof(char));

  devlist[0] = 1;

  devlist[1] = 2;

  devlist[2] = 3;

  devlist[3] = 4;

 

  //关闭原来的输出并释放资源

  release_emgst();

 

  //将参数传入函数中初始化gstreamer,并开始输出视频数据

       config_emgst(xwinid, 640, 480, devlist, 4);

}


  库文件libemgst.so已经预装在ESM7100主板的文件系统中了,客户不需要针对主板再做任何设置。在开发程序的时候,Qt工程中需要将英创公司提供的emgst.h头文件和libemgst.so库文件添加进去。头文件添加的方法十分简单,增加一个新的头文件即可。关于外部库的添加,Qt的开发工具QtCreator提供了非常简便的方法,客户只需要将libemgst.so拷贝到工程目录下,然后在QtCreator中的项目栏用鼠标右键单击工程,选择添加库(外部库),如下图:


Linux主板多通道视频采集方案.png

添加库操作界面


  选择外部库后,点击下一步,按照下图设置,在库文件一栏中选择到工程下的libemgst.so文件,如下图:


Linux主板多通道视频采集方案.png

选择库文件


  这样就完成了外部库的设置,客户可以在代码中调用libemgst.so提供的API函数了。英创公司提供了一个通过按钮切换显示视频通道数的例程,效果如下:


Linux主板多通道视频采集方案.png

例程截图


  通过这种方式,英创公司希望能够帮助客户缩短开发周期,让客户可以专注于Qt程序的开发,而不用花时间去学习并在代码中设置gstreamer。对于例程感兴趣的客户可以和工程师联系,索取相关代码。

文章标签:Qt视频