<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • ESM6802主板支持多路網絡視頻監控

     2019-7-17     作者:黃志超         

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


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


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


      考慮到部分客戶可能對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);
     
    /**
     *    包含網絡攝像頭設備信息的結構體
    *    訪問網絡攝像頭需要有ip地址,用戶名和密碼。如果是播放錄像文件,還需要填入
    *    錄像文件的地址,如果是播放實時數據,路徑填寫為NULL即可。
    *
    *    參數說明:
    *    ip:指向網絡攝像頭ip地址的指針
    *    user:指向網絡攝像頭的用戶名的指針
    *    passwd:指向網絡攝像頭密碼的指針
    *    file:指向錄像文件路徑的指針,如果播放實時圖像,賦值為NULL
    *
     */
    typedefstruct _Rtsp_config {
    char *ip;
    char *user;
    char *passwd;
    char *file;
    } Rtsp_config;
     
    /**
     *    配置gstreamer,并顯示到指定Qt窗口
    *
    *    函數會配置gstreamer,顯示多個網絡攝像頭的數據到xwinid所指定的窗口,窗口的大
    *  小通過參數width和height來確定,而網絡攝像頭的信息由指針rtsp_config傳入,listsize
    *    指定同時顯示的通道數量。因為要動態建立網絡攝像頭的連接,函數不會退出,所以
    *  需要在線程中調用。
    *
    *    參數說明:
    *  xwinid:Qt窗口的id號,每一個窗口類中都包含這個成員變量。
    *    width:顯示視頻數據所使用的窗口控件的寬度,單位pixel
    *    height:顯示視頻數據所使用的窗口控件的高度,單位pixel
    *rtsp_config:指向設備信息結構體的指針,通常是一組包含設備信息的結構體指針。
    *    詳細解釋可以查看對結構體Rtsp_config的說明
    *  listsize:顯示的視頻通道數最多支持同時顯示4路。支持1,2,4這三個值,函數會按
    *    照固定模式對顯示進行排列
    *
     *    返回值說明:
    *    0表示正常退出gstreamer
    *  -1 表示填入參數出現錯誤,啟動gstreamer失敗
    *
     */
    int config_emrtsp(unsignedint xwinid, int width,int height, Rtsp_config *rtsp_config, int listsize);
     
    /**
    *    關閉gstreamer,釋放資源
    *
    *    函數會關閉gstreamer輸出,并釋放相關資源
    *
    *    返回值說明:
    *    無返回值
    *
    */
    void release_emrtsp(void);


      init_emgst函數進行gstreamer的初始化,在啟動gstreamer功能之前需要調用一次,客戶配合Qt使用時在main函數中調用即可:


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


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


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


    ESM6802主板支持多路網絡攝像頭.png

    視頻數據顯示排列方式


      函數調用后gstreamer會將對應通道數的視頻顯示在指定的Qt窗口控件中,每一個區域所顯示的網絡攝像頭數據是通過結構體指針rtsp_config指定的,下面是部分參考代碼,創建了一個線程,通過一個按鈕啟動,把將graphicsView控件的id傳給gstreamer,并顯示設置的網絡攝像頭數據:


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


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


    ESM6802主板支持多路網絡攝像頭.png

    添加庫操作界面


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


    ESM6802主板支持多路網絡攝像頭.png

    選擇庫文件


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


    ESM6802主板支持多路網絡攝像頭.png


      通過這種方式,英創公司希望能夠幫助客戶縮短開發周期,讓客戶可以專注于Qt程序的開發,而不用花時間去學習并在代碼中設置gstreamer。對于例程感興趣的客戶可以和工程師聯系,索取相關代碼。

    久久99精品久久久久久不卡| 亚洲精品无码久久毛片波多野吉衣| 精品久久久久久久无码久中文字幕| 久久亚洲国产午夜精品理论片| 麻豆人妻少妇精品无码专区| 国产亚洲精品影视在线| 99热热久久这里只有精品166| 水蜜桃精品一二三| 国产精品色午夜视频免费看| 91九色精品国产免费| 日韩精品亚洲人成在线观看| 国产午夜福利精品久久2021| 国产精品高清在线| 国产99视频精品草莓免视看| 亚洲国产精品无码久久| 91手机看片国产福利精品| 亚洲精品无码精品mV在线观看| 国产精品免费αv视频| 国产亚洲精品美女久久久久| 精品国产日韩一区三区| 欧美国产成人精品二区芒果视频| 亚洲宅男精品一区在线观看| 91精品福利视频| 99精品视频99| 99久久er热在这里只有精品99| 亚洲国产精品VA在线看黑人| 久久99国产精品久久| 国内精品人妻无码久久久影院导航 | 亚洲日韩国产精品无码av| 久久99国产这里有精品视| 国产产无码乱码精品久久鸭| 久久精品国产只有精品2020| 亚洲国产另类久久久精品小说 | 人妻少妇精品无码专区漫画| 2022国产精品福利在线观看| 亚洲另类春色国产精品| 精品亚洲成A人无码成A在线观看 | 国产微拍精品一区二区| 久久精品亚洲日本波多野结衣| 亚洲а∨天堂久久精品9966| 99久久综合国产精品免费 |