欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Qt+opencv開發(fā)的視頻播放器示例詳解

 更新時間:2023年08月24日 09:55:07   作者:coder_Alaric  
這篇文章主要為大家介紹了基于Qt+opencv開發(fā)的視頻播放器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1、開發(fā)環(huán)境

Qt:Qt5.14

opencv:4.5.5

2、效果展示

可以實現(xiàn)播放、暫停、快進、后退、重新播放、停止、拖動進度條等功能;

3、代碼功能解析

3.1 opencv庫加載

因為使用了opencv的VideoCapture來加載視頻,這里需要添加opencv的庫,右鍵項目工程添加外部庫,填入opencv的庫和頭文件路徑,或者直接在皮肉文件下添加庫的文件路徑。

win32:CONFIG(release, debug|release): LIBS += -LD:/opencv/build/x64/vc15/lib/ -lopencv_world455
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/opencv/build/x64/vc15/lib/ -lopencv_world455d

INCLUDEPATH += D:/opencv/build/include
DEPENDPATH += D:/opencv/build/include

這里我的opencv路徑在D盤對應路徑下。

3.2 重寫horizontalSlider點擊事件

這里需要點擊進度條實現(xiàn)視頻跳轉到當前進度的功能,這里需要對horizontalSlider的點擊事件函數(shù)進行重寫。實現(xiàn)點擊后獲取點擊處的進度值并更新進度條。

#include "newqslider.h"
newqslider::newqslider(QWidget *parent) : QSlider(parent)
{
}
/*****************************************************************
* 函數(shù)名稱:mousePressEvent(QMouseEvent *ev)
* 功能描述:重寫鼠標點擊事件,實現(xiàn)進度條點擊哪跳到哪
* 參數(shù)說明: 無
* 返回值:   無
******************************************************************/
void newqslider::mousePressEvent(QMouseEvent *ev)
{
    //先調(diào)用父類的鼠標點擊處理事件,這樣可以不影響拖動的情況
    QSlider::mousePressEvent(ev);
    //獲取鼠標的位置,這里并不能直接從ev中取值(因為如果是拖動的話,鼠標開始點擊的位置沒有意義了)
    double pos = ev->pos().x() / (double)width();
    setValue(pos * (maximum() - minimum()) + minimum());
    //發(fā)送自定義的鼠標單擊信號
    emit costomSliderClicked();
}

3.3 opencv采集線程

videothread.h
#include <QObject>
#include <QThread>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <QDebug>
#include <QDateTime>
using namespace  std;
using namespace  cv;
class videothread : public QThread
{
    Q_OBJECT
public:
    videothread(const char* filename);
    void run();
    //釋放視頻采集對象
    void releaseCap();
    //獲取視頻總幀數(shù)
    int getVideoAllFramecount();
    //設置當前進度條
    void setCurrentFrame(int value);
    bool getStop() const;
    //設置視頻結束標識
    void setStop(bool value);
    bool getIsrun() const;
    void setIsrun(bool value);
    //暫停
    void pauseThread();
    //繼續(xù)
    void resumeThread();
    //停止
    void stopThread();
signals:
    //發(fā)送當前幀和 幀數(shù)
    void sendFrame(int currentFrame,Mat frame);
private:
    //視頻對象
    VideoCapture cap;
    Mat frame;
    //視頻當前幀數(shù)
    int currentFramecount;
    //總幀數(shù)
    int allFramecount;
    //視頻幀率
    int fps;
    //錄制視頻幀
    int videoWriterFrame;
    //線程結束標識位
    bool stop;
    //視頻暫停標識位
    bool isrun;
};

采集線程中設置了暫停、繼續(xù)播放、停止,并可以獲取幀率和幀率數(shù)量;

videothread.cpp
#include "videothread.h"
videothread::videothread(const char* filename)
{
    this->stop = false;
    this->isrun =false;
    this->currentFramecount=0;
    this->videoWriterFrame=0;
    if(cap.open(filename));//創(chuàng)建視頻對象
    {
        this->allFramecount=cap.get(CAP_PROP_FRAME_COUNT);//獲取視頻文件中的總幀數(shù)
        this->fps=int(round(cap.get(CAP_PROP_FPS)));//獲取視頻幀率
    }
}
void videothread::run()
{
    while(stop==false)//線程運行和停止  卡住線程 暫停時不退出線程
    {
        while(isrun==true)//視頻運行和暫停
        {
            if(cap.read(frame))//捕獲視頻幀
            {
                this->currentFramecount++;
                cvtColor(frame, frame, COLOR_BGR2RGB);//opencvBGR格式轉成Image用到的RGB
                emit sendFrame(currentFramecount,frame);//發(fā)送幀數(shù)據(jù)
            }
            msleep(40);//延時
        }
    }
    cap.release();//釋放打開的視頻
}
int videothread::getVideoAllFramecount()
{
    return allFramecount;
}
void videothread::setStop(bool value)
{
    stop = value;
}
void videothread::setCurrentFrame(int value)
{
    this->currentFramecount=value;//當前幀數(shù)
    cap.set(CAP_PROP_POS_FRAMES,currentFramecount);//進度條跳轉對應幀
}
bool videothread::getIsrun() const
{
    return isrun;
}
void videothread::setIsrun(bool value)
{
    isrun = value;
}
void videothread::pauseThread()//這兩個函數(shù)用于確保是在運行情況下才能切換狀態(tài)
{
    if(this->isRunning()&&this->isrun==true)//當前線程運行且視頻運行
    {
        this->isrun=false;
    }
}
void videothread::resumeThread()
{
    if(this->isRunning()&&this->isrun==false)//當前線程運行且視頻暫停
    {
        this->isrun=true;
    }
}
void videothread::stopThread()
{
    if(this->isRunning())//當前線程運行
    {
        this->stop=true;//結束線程
        //msleep(10);
        releaseCap();
        this->terminate();
    }
}
bool videothread::getStop() const
{
    return stop;
}
void videothread::releaseCap()
{
    if(cap.isOpened()){
        cap.release();
    }
}

總結

此視頻播放器只涉及到opencv加載視頻和對視頻幀的處理,以及進度條管理等部分功能,包括加載視頻后線程發(fā)送視頻幀圖像和幀數(shù),再使用中需要注意線程指針的創(chuàng)建和釋放、opencv采圖對象的新建和釋放,不然頻繁停止和加載會出現(xiàn)野指針和內(nèi)存泄漏的bug。

源碼學習

最后附上源碼大家交流學習,可以在倉庫按需自取,倉庫中代碼僅供學習使用。如果對自己有幫助,麻煩點個星支持一下。

videoPlay視頻播放器源碼

以上就是基于Qt+opencv開發(fā)的視頻播放器示例詳解的詳細內(nèi)容,更多關于Qt opencv視頻播放器的資料請關注腳本之家其它相關文章!

相關文章

  • C語言通過三步翻轉法實現(xiàn)單詞倒置詳解

    C語言通過三步翻轉法實現(xiàn)單詞倒置詳解

    這篇文章主要為大家分享了用三步翻轉法將一句話的單詞進行倒置的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-05-05
  • C/C++ 連接MySql數(shù)據(jù)庫的方法

    C/C++ 連接MySql數(shù)據(jù)庫的方法

    本文對如何使用MySql的API連接MySql數(shù)據(jù)庫,開發(fā)環(huán)境為VS2008,需要的朋友可以參考下
    2017-06-06
  • C語言 表、棧和隊列詳解及實例代碼

    C語言 表、棧和隊列詳解及實例代碼

    這篇文章主要介紹了C語言 表、棧和隊列詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-02-02
  • C++代碼實現(xiàn)掃雷游戲

    C++代碼實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細介紹了C++代碼實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語言與C++動態(tài)通訊錄超詳細實現(xiàn)流程

    C語言與C++動態(tài)通訊錄超詳細實現(xiàn)流程

    這篇文章主要為大家介紹了C語言與C++動態(tài)實現(xiàn)通訊錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-05-05
  • C++中范圍(Ranges)與視圖(Views)的常見問題、易錯點

    C++中范圍(Ranges)與視圖(Views)的常見問題、易錯點

    ranges和views是C20引入的重要特性,它們讓代碼更加簡潔、高效且富有表達力,通過理解其基本概念、注意常見的陷阱,并合理應用高級技巧,開發(fā)者可以充分利用這些新特性,提升軟件質量和開發(fā)效率,,本文將深入淺出地探討ranges與views的基礎概念、常見問題、易錯點及避免策略
    2024-06-06
  • C語言實現(xiàn)病例管理系統(tǒng)

    C語言實現(xiàn)病例管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)病例管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++實現(xiàn)將輸入復制到輸出的方法

    C++實現(xiàn)將輸入復制到輸出的方法

    這篇文章主要介紹了C++實現(xiàn)將輸入復制到輸出的方法,實例分析了C++字符串轉換及輸入輸出操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 使用C語言判斷棧的方向實例

    使用C語言判斷棧的方向實例

    下面小編就為大家?guī)硪黄褂肅語言判斷棧的方向實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-12-12
  • C++中雙冒號::的作用淺析

    C++中雙冒號::的作用淺析

    在C++中經(jīng)常使用雙冒號::,很多朋友不知道是什么意思,這篇文章主要介紹了C++中雙冒號::的作用,需要的朋友可以參考下
    2018-06-06

最新評論