應用方案

Linux主板多通道視頻采集方案作者:黃志超    發布時間:2019-6-20 15:51:46    被閱覽數:

  英創公司推出的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。對于例程感興趣的客戶可以和工程師聯系,索取相關代碼。

Go Top
云南快乐十分