讓你分分鐘學會qt視頻播放器

話不多說先上圖:

  實現了一個基本的播放器的例子,實現出最近本的項目,項目比較基礎,喜歡的朋友,可呀通過這些簡單的例子,實現更爲複雜的視屏播放器,比如一些客戶端。 

     不多說了來看看代碼吧:

     工程文件使用的:

QT	+= multimedia

QT += multimediawidgets

對應的頭文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include    <QMainWindow>
#include    <QMediaPlayer>
#include    <QMediaPlaylist>
#include    <QVideoWidget>

#include "qmyvideowidget.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

private:
    QMediaPlayer    *player;//視頻播放器

    QString  durationTime;//
    QString  positionTime;//

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
//自定義槽函數
    void onstateChanged(QMediaPlayer::State state);
    void onDurationChanged(qint64 duration);
    void onPositionChanged(qint64 position);

//
    void on_btnAdd_clicked();

    void on_btnPlay_clicked();

    void on_btnPause_clicked();

    void on_btnStop_clicked();

//    void on_listWidget_doubleClicked(const QModelIndex &index);

//    void on_btnClear_clicked();

    void on_sliderVolumn_valueChanged(int value);

    void on_btnSound_clicked();

//    void on_sliderPosition_valueChanged(int value);

//    void on_sliderPosition_sliderMoved(int position);

    void on_sliderPosition_valueChanged(int value);

//    void on_btnRemove_clicked();

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

對應的cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include    <QFileDialog>
//#include    <QKeyEvent>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    player = new QMediaPlayer(this);//創建視頻播放器
    player->setNotifyInterval(2000);//信息更新週期
    player->setVideoOutput(ui->videoWidget);//視頻顯示組件

    ui->videoWidget->setMediaPlayer(player);//設置顯示組件的關聯播放器

    connect(player,SIGNAL(stateChanged(QMediaPlayer::State)),
            this, SLOT(onstateChanged(QMediaPlayer::State)));

    connect(player,SIGNAL(positionChanged(qint64)),
            this, SLOT(onPositionChanged(qint64)));

    connect(player,SIGNAL(durationChanged(qint64)),
            this, SLOT(onDurationChanged(qint64)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onstateChanged(QMediaPlayer::State state)
{//播放器狀態變化
    ui->btnPlay->setEnabled(!(state==QMediaPlayer::PlayingState));
    ui->btnPause->setEnabled(state==QMediaPlayer::PlayingState);
    ui->btnStop->setEnabled(state==QMediaPlayer::PlayingState);
}

void MainWindow::onDurationChanged(qint64 duration)
{//文件時長變化
    ui->sliderPosition->setMaximum(duration);

    int   secs=duration/1000;//秒
    int   mins=secs/60; //分鐘
    secs=secs % 60;//餘數秒
    durationTime=QString::asprintf("%d:%d",mins,secs);
    ui->LabRatio->setText(positionTime+"/"+durationTime);
}

void MainWindow::onPositionChanged(qint64 position)
{//文件播放位置變化
    if (ui->sliderPosition->isSliderDown())
        return; //如果正在拖動滑條,退出

    ui->sliderPosition->setSliderPosition(position);//

    int   secs=position/1000;//秒
    int   mins=secs/60; //分鐘
    secs=secs % 60;//餘數秒
    positionTime=QString::asprintf("%d:%d",mins,secs);
    ui->LabRatio->setText(positionTime+"/"+durationTime);
}

void MainWindow::on_btnAdd_clicked()
{//打開文件
    QString curPath=QDir::homePath();//獲取系統當前目錄
    QString dlgTitle="選擇視頻文件"; //對話框標題
    QString filter="wmv文件(*.wmv);;mp4文件(*.mp4);;所有文件(*.*)"; //文件過濾器
    QString aFile=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);

    if (aFile.isEmpty())
      return;

    QFileInfo   fileInfo(aFile);
    ui->LabCurMedia->setText(fileInfo.fileName());

    player->setMedia(QUrl::fromLocalFile(aFile));//設置播放文件
    player->play();
}

void MainWindow::on_btnPlay_clicked()
{//播放
    player->play();
}

void MainWindow::on_btnPause_clicked()
{//暫停
    player->pause();
}

void MainWindow::on_btnStop_clicked()
{//停止
    player->stop();
}

void MainWindow::on_sliderVolumn_valueChanged(int value)
{//調節音量
    player->setVolume(value);
}

void MainWindow::on_btnSound_clicked()
{//靜音按鈕
    bool mute=player->isMuted();
    player->setMuted(!mute);
    if (mute)
        ui->btnSound->setIcon(QIcon(":/images/images/volumn.bmp"));
    else
        ui->btnSound->setIcon(QIcon(":/images/images/mute.bmp"));
}

void MainWindow::on_sliderPosition_valueChanged(int value)
{//播放位置
   player->setPosition(value);
}

void MainWindow::on_pushButton_clicked()
{//全屏按鈕
    ui->videoWidget->setFullScreen(true);
}

自定義視頻顯示組件 QmyVideoWidget
 

#ifndef QMYVIDEOWIDGET_H
#define QMYVIDEOWIDGET_H

#include    <QObject>
#include    <QWidget>
#include    <QVideoWidget>
#include    <QMediaPlayer>

class QmyVideoWidget : public QVideoWidget
{
private:
    QMediaPlayer    *thePlayer;//

protected:
    void keyPressEvent(QKeyEvent *event);

    void mousePressEvent(QMouseEvent *event);

public:
    QmyVideoWidget(QWidget *parent = Q_NULLPTR);

    void    setMediaPlayer(QMediaPlayer *player);
};

#endif // QMYVIDEOWIDGET_H

對應的cpp文件:

#include "qmyvideowidget.h"
#include    <QKeyEvent>
#include    <QMouseEvent>

void QmyVideoWidget::keyPressEvent(QKeyEvent *event)
{//按鍵事件,ESC退出全屏狀態
    if ((event->key() == Qt::Key_Escape)&&(isFullScreen()))
    {
        setFullScreen(false);
        event->accept();
        QVideoWidget::keyPressEvent(event);
    }
}

void QmyVideoWidget::mousePressEvent(QMouseEvent *event)
{//鼠標事件,單擊控制暫停和繼續播放
    if (event->button()==Qt::LeftButton)
    {
        if (thePlayer->state()==QMediaPlayer::PlayingState)
          thePlayer->pause();
        else
          thePlayer->play();
    }
    QVideoWidget::mousePressEvent(event);

}

QmyVideoWidget::QmyVideoWidget(QWidget *parent):QVideoWidget(parent)
{

}

void QmyVideoWidget::setMediaPlayer(QMediaPlayer *player)
{//設置播放器
    thePlayer=player;
}

例子連接:

鏈接:https://pan.baidu.com/s/11R3FfGJxVtH54vMC4FvJlA 
提取碼:5oa1 
 

使用QGraphicsVideoltem 顯示視屏跟這個區別不太大,就不寫博客了,留下例子,大家學習下:

鏈接:https://pan.baidu.com/s/19kp2qZ_es19G0-EBF-E5og 
提取碼:o6to

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章