話不多說先上圖:
實現了一個基本的播放器的例子,實現出最近本的項目,項目比較基礎,喜歡的朋友,可呀通過這些簡單的例子,實現更爲複雜的視屏播放器,比如一些客戶端。
不多說了來看看代碼吧:
工程文件使用的:
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