Qt怎么實現(xiàn)通用視頻控件

本篇內(nèi)容介紹了“Qt怎么實現(xiàn)通用視頻控件”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了洛江免費建站歡迎大家使用!

一、前言

自從視頻監(jiān)控系統(tǒng)的內(nèi)核不斷增加,從最初的vlc到ffmpeg然后到mpv,后面還陸續(xù)增加了??祍dk等,每次增加一個內(nèi)核,整個視頻監(jiān)控系統(tǒng)就有三五個代碼文件需要修改,而且大部分是重復的代碼,通過define來區(qū)分不同的內(nèi)核,所以重新整理了一個視頻類,里面就define處理好了,提供了個公共接口,在需要的地方直接實例化一個類就行,而不需要在不同的地方實例化不同的類,大大減輕了后期的工作量,也復用了很多代碼。

通用視頻控件基本功能:

  1. 調(diào)用setUrl函數(shù)設置要播放的視頻文件或者流地址。

  2. 調(diào)用open方法打開視頻、close方法關(guān)閉視頻。

  3. 調(diào)用pause方法暫停播放、next方法繼續(xù)播放。

  4. 調(diào)用getVolume函數(shù)獲取音量、setVolume函數(shù)設置音量。

  5. 調(diào)用getMute函數(shù)獲取靜音狀態(tài)、setMute函數(shù)設置靜音。

  6. 調(diào)用getLength函數(shù)獲取文件長度。

  7. 調(diào)用getPosition函數(shù)獲取當前播放位置、setPosition設置播放位置。

  8. 播放成功發(fā)出receivePlayStart信號。

  9. 播放失敗發(fā)出receivePlayError信號。

  10. 播放結(jié)束發(fā)出receivePlayFinsh信號。

  11. 執(zhí)行截圖動作后,觸發(fā)snapImage信號。

  12. 解析出一張圖片后,觸發(fā)receiveImage信號。

  13. 播放文件發(fā)出fileLengthReceive總時長信號。

  14. 音量調(diào)節(jié)或者靜音狀態(tài)變動后發(fā)出fileVolumeReceive信號。

  15. 播放位置變動后發(fā)出filePositionReceive信號。

  16. 接收到拖曳文件發(fā)出fileDrag信號。

  17. 懸浮條工具欄點擊按鈕后發(fā)出btnClicked信號。

  18. 設置是否保存文件、保存間隔、保存文件夾。

  19. 設置是否拉伸填充圖片、是否深拷貝圖片。

  20. 設置是否斷線重連、超時時間。

  21. 設置懸浮條可見、背景顏色、按下顏色等。

  22. 設置邊框粗細和顏色、背景文字和圖片。

  23. 設置兩路OSD的字號、文本、顏色、位置、格式等。

  24. 設置是否采用回調(diào)、硬解碼名稱、流通信協(xié)議等。

二、功能特點

  1. 支持多畫面切換,全屏切換等,包括1+4+6+8+9+13+16+25+36+64畫面切換。

  2. 支持alt+enter全屏,esc退出全屏。

  3. 自定義信息框+錯誤框+詢問框+右下角提示框(包含多種格式)。

  4. 17套皮膚樣式隨意更換,所有樣式全部統(tǒng)一,包括菜單等。

  5. 云臺儀表盤鼠標移上去高亮,八個方位精準識別。

  6. 底部畫面工具欄(畫面分割切換+截圖聲音等設置)移上去高亮。

  7. 可在配置文件更改左上角logo+中文軟件名稱+英文軟件名稱。

  8. 封裝了百度地圖,視圖切換,運動軌跡,設備點位,鼠標按下獲取經(jīng)緯度等。

  9. 支持圖片地圖,設備按鈕可以在圖片地圖上自由拖動自動保存位置信息。

  10. 在百度地圖和圖片地圖上,雙擊視頻可以預覽攝像頭實時視頻。

  11. 堆棧窗體,每個窗體都是個單獨的qwidget,方便編寫自己的代碼。

  12. 頂部鼠標右鍵菜單,可動態(tài)控制時間CPU+左上角面板+左下角面板+右上角面板+右下角面板的顯示和隱藏,支持恢復默認布局。

  13. 工具欄可以放置多個小圖標和關(guān)閉圖標。

  14. 左側(cè)右側(cè)可拖動拉伸,并自動記憶寬高位置,重啟后恢復。

  15. 雙擊攝像機節(jié)點自動播放視頻,雙擊節(jié)點自動依次添加視頻,會自動跳到下一個,雙擊父節(jié)點自動添加該節(jié)點下的所有視頻。

  16. 攝像機節(jié)點拖曳到對應窗體播放視頻,同時支持拖曳本地文件直接播放。

  17. 視頻畫面窗體支持拖曳交換,瞬間響應。

  18. 雙擊節(jié)點+拖曳節(jié)點+拖曳窗體交換位置,均自動更新url.txt。

  19. 支持從url.txt中加載通道視頻播放,自動記憶最后通道對應的視頻,軟件啟動后自動打開播放。

  20. 右下角音量條控件,失去焦點自動隱藏,音量條帶靜音圖標。

  21. 集成百度在線地圖和離線地圖,可以添加設備對應位置,自動生成地圖,支持縮放和添加覆蓋物等。

  22. 視頻拖動到通道窗體外自動刪除視頻。

  23. 鼠標右鍵可刪除當前+所有視頻,截圖當前+所有視頻。

  24. 錄像機管理、攝像機管理,可添加刪除修改導入導出打印信息,立即應用新的設備信息生成樹狀列表,不需重啟。

  25. 在pro文件中可以自由開啟是否加載地圖。

  26. 視頻播放可選2種內(nèi)核自由切換,vlc+ffmpeg,均可在pro中設置。

  27. 可設置1+4+9+16畫面輪詢,可設置輪詢間隔以及輪詢碼流類型等,直接在主界面底部工具欄右側(cè)單擊啟動輪詢按鈕即可,再次單擊停止輪詢。

  28. 默認超過10秒鐘未操作自動隱藏鼠標指針。

  29. 支持onvif搜素設備,支持任意onvif攝像機,包括但不限于??荡笕A宇視天地偉業(yè)華為等。

  30. 支持onvif云臺控制,可上下左右移動云臺攝像機,包括復位和焦距調(diào)整等。

  31. 同時支持sqlite、MySQL、postsql等數(shù)據(jù)庫。

  32. 可保存視頻,可選定時存儲或者單文件存儲,可選存儲間隔時間。

  33. 可設置視頻流通信方式tcp+udp,可設置視頻解碼是速度優(yōu)先、質(zhì)量優(yōu)先、均衡等。

  34. 可設置硬解碼類型,支持qsv、dxva2、d3d11va等。

  35. 默認采用opengl繪制視頻,超低的CPU資源占用,支持yuyv和nv12兩種格式繪制,很牛逼。

  36. 高度可定制化,用戶可以很方便的在此基礎(chǔ)上衍生自己的功能,支持linux和mac系統(tǒng)。

三、效果圖

Qt怎么實現(xiàn)通用視頻控件

四、核心代碼

#ifndef COMMONVIDEOWIDGET_H
#define COMMONVIDEOWIDGET_H

#ifdef videovlc
#include "vlcwidget.h"
#elif videoffmpeg
#include "ffmpegwidget.h"
#elif videompv
#include "mpvwidget.h"
#elif haikang
#include "haikangwidget.h"
#else
#include "videowidget.h"
#endif

class CommonVideoWidget : public QWidget
{
    Q_OBJECT
public:
    //標簽格式
    enum OSDFormat {
        OSDFormat_Text = 0,             //文本
        OSDFormat_Date = 1,             //日期
        OSDFormat_Time = 2,             //時間
        OSDFormat_DateTime = 3,         //日期時間
        OSDFormat_Image = 4             //圖片
    };

    //標簽位置
    enum OSDPosition {
        OSDPosition_Left_Top = 0,       //左上角
        OSDPosition_Left_Bottom = 1,    //左下角
        OSDPosition_Right_Top = 2,      //右上角
        OSDPosition_Right_Bottom = 3    //右下角
    };

    explicit CommonVideoWidget(QWidget *parent = 0);
    ~CommonVideoWidget();    

private:
#ifdef videovlc
    VlcWidget *widget;
#elif videoffmpeg
    FFmpegWidget *widget;
#elif videompv
    MpvWidget *widget;
#elif haikang
    HaiKangWidget *widget;
#else
    VideoWidget *widget;
#endif

public:
    QImage getImage()               const;
    QPixmap getPixmap()             const;
    QString getUrl()                const;
    QDateTime getLastTime()         const;

    bool getCallback()              const;
    bool getIsPlaying()             const;
    bool getIsRtsp()                const;
    bool getIsUsbCamera()           const;

    bool getCopyImage()             const;
    bool getCheckLive()             const;
    bool getDrawImage()             const;
    bool getFillImage()             const;

    bool getFlowEnable()            const;
    QColor getFlowBgColor()         const;
    QColor getFlowPressColor()      const;

    int getTimeout()                const;
    int getBorderWidth()            const;
    QColor getBorderColor()         const;
    QColor getFocusColor()          const;
    QString getBgText()             const;
    QImage getBgImage()             const;

    bool getOSD1Visible()           const;
    int getOSD1FontSize()           const;
    QString getOSD1Text()           const;
    QColor getOSD1Color()           const;
    QImage getOSD1Image()           const;
    OSDFormat getOSD1Format()       const;
    OSDPosition getOSD1Position()   const;

    bool getOSD2Visible()           const;
    int getOSD2FontSize()           const;
    QString getOSD2Text()           const;
    QColor getOSD2Color()           const;
    QImage getOSD2Image()           const;
    OSDFormat getOSD2Format()       const;
    OSDPosition getOSD2Position()   const;

    int getFaceBorder()             const;
    QColor getFaceColor()           const;
    QList<QRect> getFaceRects()     const;

signals:
    //播放成功
    void receivePlayStart();
    //播放失敗
    void receivePlayError();
    //播放結(jié)束
    void receivePlayFinsh();

    //截圖信號
    void snapImage(const QImage &image);
    //收到圖片信號
    void receiveImage(const QImage &image);

    //總時長
    void fileLengthReceive(qint64 length);
    //當前播放時長
    void filePositionReceive(qint64 position);
    //音量大小
    void fileVolumeReceive(int volume, bool muted);

    //接收到拖曳文件
    void fileDrag(const QString &url);
    //工具欄單擊
    void btnClicked(const QString &btnName);

public slots:
    //設置焦點
    void setFocus2();

    //設置視頻寬度
    void setVideoWidth(int videoWidth);
    //設置視頻高度
    void setVideoHeight(int videoHeight);

    //設置緩存圖片寬度
    void setBufferWidth(int bufferWidth);
    //設置緩存圖片高度
    void setBufferHeight(int bufferHeight);

    //獲取長度
    qint64 getLength();
    //獲取當前播放位置
    qint64 getPosition();
    //設置播放位置
    void setPosition(qint64 position);

    //獲取靜音狀態(tài)
    bool getMuted();
    //設置靜音
    void setMuted(bool muted);

    //獲取音量
    int getVolume();
    //設置音量
    void setVolume(int volume);

    //設置顯示間隔
    void setInterval(int interval);
    //設置幀數(shù),用于播放自身存儲的視頻流文件,控制播放速度
    void setVideoFps(int videoFps);
    //設置休眠時間
    void setSleepTime(int sleepTime);
    //設置檢測連接超時
    void setCheckTime(int checkTime);
    //設置是否檢測連接
    void setCheckConn(bool checkConn);
    //設置是否播放音頻
    void setPlayAudio(bool playAudio);

    //設置視頻流地址
    void setUrl(const QString &url);
    //設置是否采用回調(diào)
    void setCallback(bool callback);
    //設置硬件解碼器名稱
    void setHardware(const QString &hardware);
    //設置通信協(xié)議
    void setTransport(const QString &transport);
    //設置緩存時間
    void setCaching(int caching);
    //設置圖片質(zhì)量類型
    void setImageFlag(int imageFlag);

#ifdef videoffmpeg
    //設置參數(shù)
    void setOption(const char *key, const char *value);
#elif videovlc
    //設置參數(shù)
    void setOption(const QString &option);
#elif videompv
    //通用屬性接口
    QVariant getValue(const QString &name);
    void setValue(const QString &name, const QVariant &value);
    void setOption(const QString &name, const QVariant &value);
    void command(const QVariant &args);
#endif

    //設置是否保存文件
    void setSaveFile(bool saveFile);
    //設置保存間隔
    void setSaveInterval(int saveInterval);
    //設置保存文件夾
    void setSavePath(const QString &savePath);
    //設置定時保存文件唯一標識符
    void setFileFlag(const QString &fileFlag);
    //設置保存文件名稱
    void setFileName(const QString &fileName);
    //設置只存儲單個文件的保存時間
    void setSaveTime(const QDateTime &saveTime);

    //設置是否拷貝圖片
    void setCopyImage(bool copyImage);
    //設置是否檢測活著
    void setCheckLive(bool checkLive);
    //設置是否實時繪制圖片
    void setDrawImage(bool drawImage);
    //設置是否拉伸填充
    void setFillImage(bool fillImage);

    //設置是否啟用懸浮條
    void setFlowEnable(bool flowEnable);
    //設置懸浮條背景顏色
    void setFlowBgColor(const QColor &flowBgColor);
    //設置懸浮條按下顏色
    void setFlowPressColor(const QColor &flowPressColor);

    //設置超時時間
    void setTimeout(int timeout);
    //設置邊框?qū)挾?
    void setBorderWidth(int borderWidth);
    //設置邊框顏色
    void setBorderColor(const QColor &borderColor);
    //設置有焦點邊框顏色
    void setFocusColor(const QColor &focusColor);
    //設置無圖像文字
    void setBgText(const QString &bgText);
    //設置無圖像背景圖
    void setBgImage(const QImage &bgImage);

    //設置標簽1是否可見
    void setOSD1Visible(bool osdVisible);
    //設置標簽1文字字號
    void setOSD1FontSize(int osdFontSize);
    //設置標簽1文本
    void setOSD1Text(const QString &osdText);
    //設置標簽1文字顏色
    void setOSD1Color(const QColor &osdColor);
    //設置標簽1圖片
    void setOSD1Image(const QImage &osdImage);
    //設置標簽1格式
    void setOSD1Format(const OSDFormat &osdFormat);
    //設置標簽1位置
    void setOSD1Position(const OSDPosition &osdPosition);

    //設置標簽2是否可見
    void setOSD2Visible(bool osdVisible);
    //設置標簽2文字字號
    void setOSD2FontSize(int osdFontSize);
    //設置標簽2文本
    void setOSD2Text(const QString &osdText);
    //設置標簽2文字顏色
    void setOSD2Color(const QColor &osdColor);
    //設置標簽2圖片
    void setOSD2Image(const QImage &osdImage);
    //設置標簽2格式
    void setOSD2Format(const OSDFormat &osdFormat);
    //設置標簽2位置
    void setOSD2Position(const OSDPosition &osdPosition);

    //設置人臉框粗細
    void setFaceBorder(int faceBorder);
    //設置人臉框顏色
    void setFaceColor(const QColor &faceColor);
    //設置人臉框區(qū)域集合
    void setFaceRects(const QList<QRect> &faceRects);

    //打開設備
    void open();
    //暫停
    void pause();
    //繼續(xù)
    void next();
    //關(guān)閉設備
    void close();
    //重新加載
    void restart(int delayOpen = 20);
    //清空
    void clear();
    //快照
    void snap(const QString &fileName);
};
#endif // COMMONVIDEOWIDGET_H

“Qt怎么實現(xiàn)通用視頻控件”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

網(wǎng)站標題:Qt怎么實現(xiàn)通用視頻控件
文章起源:http://bm7419.com/article28/pssdjp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化品牌網(wǎng)站建設、營銷型網(wǎng)站建設用戶體驗、建站公司云服務器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)