激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月

ESM6802主板支持多路網(wǎng)絡(luò)視頻監(jiān)控

 2019-7-17     作者:黃志超         
文章標(biāo)簽:C/C++QtESM7000系列視頻

  我們已經(jīng)介紹過在ESM7100主板上支持多路模擬攝像頭的方案,詳細(xì)資料可以參考《Linux主板多通道視頻采集方案》。在很多工業(yè)現(xiàn)場中還會使用到網(wǎng)絡(luò)攝像頭,它的優(yōu)點是可以通過網(wǎng)絡(luò)獲取數(shù)據(jù),沒有距離的限制,只需要提供一個常用的普通網(wǎng)絡(luò)接口就可以進(jìn)行通訊,非常靈活。但是網(wǎng)絡(luò)攝像頭傳輸?shù)臄?shù)據(jù)都是通過了編碼(現(xiàn)在常見格式有 H.264、MPEG-4、MJPEG)的,在接收到數(shù)據(jù)后,如果要在主板上進(jìn)行處理和顯示,就需要對數(shù)據(jù)進(jìn)行解碼。實現(xiàn)解碼功能需要硬件的支持,依靠軟件解碼會消耗大量的CPU資源,而且性能也不理想,所以如果要連接網(wǎng)絡(luò)攝像頭,就只能夠使用擁有硬件編解碼功能的ESM6802這一款核心板。


  ESM6802的處理器為雙核Crotex-A9,主頻1GHz的i.MX6DL,CPU內(nèi)部集成了一個擁有編解碼功能的VPU(Video Processing Unit),通過VPU進(jìn)行解碼不會消耗過多的CPU資源,而ESM6802內(nèi)部的VPU可以支持多種格式的解碼,包括了常見的H.264、MPEG-4、MJPEG等格式,能夠支持的最大分辨率為1920x1088,同時最多可以處理4路攝像頭的數(shù)據(jù)。下面我們就以ESM6802為例,介紹如何使用在Qt界面中顯示網(wǎng)絡(luò)攝像頭的數(shù)據(jù)。


  軟件上同樣還是使用gstreamer和Qt來實現(xiàn),ESM6802的文件系統(tǒng)中已經(jīng)集成了gstreamer和Qt5.8相關(guān)的庫和工具,并且包含了處理網(wǎng)絡(luò)攝像頭通訊協(xié)議rtsp和操作VPU編解碼的插件,而gstreamer能夠支持多種圖形系統(tǒng)包括Qt。所以利用gstreame能夠快速方便的獲取網(wǎng)絡(luò)攝像頭的數(shù)據(jù)并顯示到Qt界面中,關(guān)于gstreamer的詳細(xì)介紹,可以參考網(wǎng)站https://gstreamer.freedesktop.org/documentation/index.html?gi-language=c


  考慮到部分客戶可能對gstreamer不熟悉,英創(chuàng)公司在gstreamer提供的API函數(shù)基礎(chǔ)上重新封裝了一層,通過庫文件libemgst.so提供三個API函數(shù)和一個包含網(wǎng)絡(luò)攝像頭信息的結(jié)構(gòu)體變量,利用這三個API函數(shù),客戶就可以將視頻數(shù)據(jù)顯示在Qt實現(xiàn)的界面上,而不需要使用代碼對gstreamer單獨進(jìn)行操作,客戶可以專注于Qt程序的開發(fā)。下面就詳細(xì)介紹libemgst.so的三個API函數(shù)和結(jié)構(gòu)體變量:


/**
 *    初始化gstreamer
*
*    本函數(shù)在C的main函數(shù)中調(diào)用,將會初始化gstreamer庫
*
*    參數(shù)說明:
*    使用main函數(shù)的兩個參數(shù)填入,gstramer初始化時需要讀取main函數(shù)的兩個參數(shù)
*
  *      返回值說明:
*    無返回值
*
 */
void init_emgst(int argc, char **argv);
 
/**
 *    包含網(wǎng)絡(luò)攝像頭設(shè)備信息的結(jié)構(gòu)體
*    訪問網(wǎng)絡(luò)攝像頭需要有ip地址,用戶名和密碼。如果是播放錄像文件,還需要填入
*    錄像文件的地址,如果是播放實時數(shù)據(jù),路徑填寫為NULL即可。
*
*    參數(shù)說明:
*    ip:指向網(wǎng)絡(luò)攝像頭ip地址的指針
*    user:指向網(wǎng)絡(luò)攝像頭的用戶名的指針
*    passwd:指向網(wǎng)絡(luò)攝像頭密碼的指針
*    file:指向錄像文件路徑的指針,如果播放實時圖像,賦值為NULL
*
 */
typedefstruct _Rtsp_config {
char *ip;
char *user;
char *passwd;
char *file;
} Rtsp_config;
 
/**
 *    配置gstreamer,并顯示到指定Qt窗口
*
*    函數(shù)會配置gstreamer,顯示多個網(wǎng)絡(luò)攝像頭的數(shù)據(jù)到xwinid所指定的窗口,窗口的大
*  小通過參數(shù)width和height來確定,而網(wǎng)絡(luò)攝像頭的信息由指針rtsp_config傳入,listsize
*    指定同時顯示的通道數(shù)量。因為要動態(tài)建立網(wǎng)絡(luò)攝像頭的連接,函數(shù)不會退出,所以
*  需要在線程中調(diào)用。
*
*    參數(shù)說明:
*  xwinid:Qt窗口的id號,每一個窗口類中都包含這個成員變量。
*    width:顯示視頻數(shù)據(jù)所使用的窗口控件的寬度,單位pixel
*    height:顯示視頻數(shù)據(jù)所使用的窗口控件的高度,單位pixel
*rtsp_config:指向設(shè)備信息結(jié)構(gòu)體的指針,通常是一組包含設(shè)備信息的結(jié)構(gòu)體指針。
*    詳細(xì)解釋可以查看對結(jié)構(gòu)體Rtsp_config的說明
*  listsize:顯示的視頻通道數(shù)最多支持同時顯示4路。支持1,2,4這三個值,函數(shù)會按
*    照固定模式對顯示進(jìn)行排列
*
 *    返回值說明:
*    0表示正常退出gstreamer
*  -1 表示填入?yún)?shù)出現(xiàn)錯誤,啟動gstreamer失敗
*
 */
int config_emrtsp(unsignedint xwinid, int width,int height, Rtsp_config *rtsp_config, int listsize);
 
/**
*    關(guān)閉gstreamer,釋放資源
*
*    函數(shù)會關(guān)閉gstreamer輸出,并釋放相關(guān)資源
*
*    返回值說明:
*    無返回值
*
*/
void release_emrtsp(void);


  init_emgst函數(shù)進(jìn)行g(shù)streamer的初始化,在啟動gstreamer功能之前需要調(diào)用一次,客戶配合Qt使用時在main函數(shù)中調(diào)用即可:


int main(int argc, char *argv[])
{
       //初始化英創(chuàng)主板gstreamer功能
       init_emgst(argc, argv);
 
       //Qt窗口初始化,由QtCreator自動生成
       QApplicationa(argc, argv);
       MainWindow w;
       w.show();
 
       return a.exec();
}


  config_emrtsp函數(shù)會配置并啟動gstreamer,要將網(wǎng)絡(luò)攝像頭的數(shù)據(jù)顯示在指定的窗口中,客戶只要得到用來顯示視頻的窗口控件的id就可以了,在每一個Qt窗口控件類中都有對應(yīng)的成員變量,可以很簡單的獲取到。通過rtsp_config填入網(wǎng)絡(luò)攝像頭的信息,包含網(wǎng)絡(luò)攝像頭的ip,用戶名,密碼和錄像文件路徑,如果只是播放實時圖像,錄像文件路徑填為NULL就行了,函數(shù)會動態(tài)監(jiān)測網(wǎng)絡(luò)攝像頭的連接,只有當(dāng)播放完成才會退出,比如錄像文件播放完畢或者手動關(guān)閉的情況,所以建議在線程中調(diào)用函數(shù)config_emrtsp。和網(wǎng)絡(luò)攝像頭的連接建立后,ESM6802主板會根據(jù)網(wǎng)絡(luò)攝像頭的編碼格式自行選擇合適的解碼方式,不需要客戶做任何設(shè)置,網(wǎng)絡(luò)攝像頭常用的H.264、MPEG-4、MJPEG編碼格式都可以支持。


  config_emrtsp函數(shù)會根據(jù)width和height的值自動分配顯示區(qū)域,listsize指定同時顯示的通道數(shù),支持的值為1、2、4,顯示的方式如下圖:


ESM6802主板支持多路網(wǎng)絡(luò)攝像頭.png

視頻數(shù)據(jù)顯示排列方式


  函數(shù)調(diào)用后gstreamer會將對應(yīng)通道數(shù)的視頻顯示在指定的Qt窗口控件中,每一個區(qū)域所顯示的網(wǎng)絡(luò)攝像頭數(shù)據(jù)是通過結(jié)構(gòu)體指針rtsp_config指定的,下面是部分參考代碼,創(chuàng)建了一個線程,通過一個按鈕啟動,把將graphicsView控件的id傳給gstreamer,并顯示設(shè)置的網(wǎng)絡(luò)攝像頭數(shù)據(jù):


//派生一個Qt線程類,用獲取config_emrtsp函數(shù)的參數(shù),并在線程中啟動
class Rtsp_pThread :public QThread
{
    Q_OBJECT
 
public:
void run();
 
       //窗口控件的寬度
int width;
//窗口控件的高度
int height;
//顯示的通道數(shù)量
int num_of_chan;
//窗口控件ID
WIdxwinid;
//包含網(wǎng)絡(luò)攝像頭信息的結(jié)構(gòu)體指針
Rtsp_config *rtsp_config;
};
void MainWindow::on_confirm_released()
{
       //初始化結(jié)構(gòu)體指針
rtsp_config = (Rtsp_config*)malloc(max_chan*sizeof(Rtsp_config));
 
//填入每一路網(wǎng)絡(luò)攝像頭的ip,用戶名和密碼,因為不是播放錄像文件,所以file一項填寫的NULL。示例是顯示了四路網(wǎng)絡(luò)攝像頭的數(shù)據(jù),因為都是訪問的同一個攝像頭,所以填寫的信息是一致的
for(i=0; i<max_chan; i++){
       //網(wǎng)絡(luò)攝像頭的ip地址
       (rtsp_config+i)->ip = (char*)malloc(20*sizeof(char));
       sprintf((rtsp_config+i)->ip, "192.168.201.84");
 
       //網(wǎng)絡(luò)攝像頭的用戶名
       (rtsp_config+i)->user = (char*)malloc(20*sizeof(char));
       sprintf((rtsp_config+i)->user, "admin");
 
       //網(wǎng)絡(luò)攝像頭的密碼
       (rtsp_config+i)->passwd = (char*)malloc(20*sizeof(char));
       sprintf((rtsp_config+i)->passwd, "******");
 
       (rtsp_config+i)->file = NULL;
}
 
       //將顯示區(qū)域的寬度,高度和等信息值賦給線程類的成員變量
rtsp_thread.width = ui->graphicsView->width();
rtsp_thread.height = ui->graphicsView->height();
rtsp_thread.num_of_chan = max_chan;
rtsp_thread.rtsp_config = rtsp_config;
 
//啟動線程
rtsp_thread.start();
}
void Rtsp_pThread::run()
{
       //在線程中調(diào)用函數(shù)config_emrtsp,啟動顯示
config_emrtsp(xwinid, width, height, rtsp_config, num_of_chan);
}
release_emgst函數(shù)會停止gstreamer輸出,并釋放資源,在程序退出或者需要切換顯示的時候調(diào)用,下面的代碼是通過檢測Qt按鈕控件的點擊事件,關(guān)閉顯示:
void MainWindow::on_setting_released()
{
int i;
 
//停止顯示,并釋放相關(guān)資源
release_emrtsp();
//退出線程
rtsp_thread.quit();
}


  庫文件libemgst.so已經(jīng)預(yù)裝在ESM6802主板的文件系統(tǒng)中了,客戶不需要針對主板再做任何設(shè)置。在開發(fā)程序的時候,Qt工程中需要將英創(chuàng)公司提供的emgst.h頭文件和libemgst.so庫文件添加進(jìn)去。頭文件添加的方法十分簡單,增加一個新的頭文件即可。關(guān)于外部庫的添加,Qt的開發(fā)工具QtCreator提供了非常簡便的方法,客戶只需要將libemgst.so拷貝到工程目錄下,然后在QtCreator中的項目欄用鼠標(biāo)右鍵單擊工程,選擇添加庫(外部庫),如下圖:


ESM6802主板支持多路網(wǎng)絡(luò)攝像頭.png

添加庫操作界面


  選擇外部庫后,點擊下一步,按照下圖設(shè)置,在庫文件一欄中選擇到工程下的libemgst.so文件,如下圖:


ESM6802主板支持多路網(wǎng)絡(luò)攝像頭.png

選擇庫文件


  這樣就完成了外部庫的設(shè)置,客戶可以在代碼中調(diào)用libemgst.so提供的API函數(shù)了。英創(chuàng)公司提供了一個通過按鈕切換顯示視頻通道數(shù)的例程,效果如下:


ESM6802主板支持多路網(wǎng)絡(luò)攝像頭.png


  通過這種方式,英創(chuàng)公司希望能夠幫助客戶縮短開發(fā)周期,讓客戶可以專注于Qt程序的開發(fā),而不用花時間去學(xué)習(xí)并在代碼中設(shè)置gstreamer。對于例程感興趣的客戶可以和工程師聯(lián)系,索取相關(guān)代碼。

文章標(biāo)簽:C/C++QtESM7000系列視頻
主站蜘蛛池模板: 中文字幕一精品亚洲无线一区| 在线精品国产| 国产福利视精品永久免费| 久久久噜噜噜www成人网| 亚洲一区www| 中文字幕在线播放视频| 任你操精品| 欧美三级成版人版在线观看| 精品国产三级在线观看| 欧美日韩亚洲区久久综合| 亚洲综合欧美色综合小说| 一级成人毛片免费观看| 日本色黄视频| 孕妇孕妇aaaaa级毛片视频| 欧美做爱毛片| 国产在线视频www色| 精品国产区一区二区三区在线观看| sese日本| 日本一级特黄毛片免费视频 | 成人三级黄色片| 欧美日韩一区二区高清视| 国产在线观看一区二区三区四区| 草在线视频| 高清国产精品入口麻豆| 福利二区| 国产在线精品视频| 免费观看亚洲| 欧美日韩国产另类在线观看| 婷婷丁香在线| 香蕉片视频在线观看| 亚洲精品综合一区二区三区在线 | 亚洲黄色图| 亚洲一区二区三区高清视频| 51精品视频在线播放观看| a毛片视频| 女人被免费视频网站| 亚洲精品一区二区三区四区| 成人网视频免费播放| 成年免费大片黄在线观看岛国| 色婷婷在线视频| 自拍视频网|