0、显示效果
1、设计思路
使用qt制作播放器方法有很多,但是不使用第三方库,则只能使用QVideoWidget
类+QMediaPlayer
类方法(这里话说太满了,容易被打脸)
QVideoWidget
类是一个继承QWidget
的界面类,用于视频显示。QMediaPlayer
类用于解析音频文件和视频文件,继承自QMediaObject
。QMediaObject
可以提供关于媒体内容的接入,通过URL进行初始化,同时也可以提供可以播放的媒体文件的列表,与QMediaplayer
对象息息相关。
qt视频播放界面类VideoWidget
,则是集合了QVideoWidget
类+QMediaPlayer
类,将该搭档组合在了一起,在VideoWidget
类中实例化,并设置外部视频播放控制所必要的接口,如播放、暂停、停止、设置播放速度、设置播放视频等等(具体看源代码中h文件)。
既然是界面类设计,所以VideoWidget
是继承QWidget
类,后期应用也是使用QWidget
提升。
2、源代码
h文件:
#ifndef VIDEOWIDGET_H
#define VIDEOWIDGET_H
#include <QObject>
#include <QWidget>
#include <QVideoWidget>
#include <QMediaPlayer>
class VideoWidget : public QWidget
{
Q_OBJECT
public:
explicit VideoWidget(QWidget *parent = nullptr);
~VideoWidget();
void setVideoName(QString name);
QString getVideoName(); //获取导入的视频名字
void init(); //播放初始化,初始化一些状态
bool play(); //启动,无设置视频名情况下失败返回0
bool pause();
bool stop(); //关闭,无播放情况下失败返回0
void setPlaySpeed(double speed); //设置播放速度
quint64 getDuration(); //获取视频时长
bool setPlayPos(quint64 position);
quint64 getCurrentPlyPos();
void setVideoBackColor(QColor color);
signals:
void stateChanged(QMediaPlayer::State); //播放状态改动
void positionChanged(qint64); //播放位置改动
void durationChanged(qint64); //播放时间改动
private slots:
void OnStateChanged(QMediaPlayer::State enumState);
private:
QVideoWidget *mVideoWidget;
QMediaPlayer *mPlayer;
QString videoName;
QMediaPlayer::State mState;
void resizeEvent(QResizeEvent *event);
};
#endif // VIDEOWIDGET_H
cpp文件:
#include "videowidget.h"
VideoWidget::VideoWidget(QWidget *parent) : QWidget(parent)
{
mVideoWidget = new QVideoWidget(this);
mPlayer = new QMediaPlayer;
mPlayer->setVideoOutput(mVideoWidget); //设置视频输出显示位置
//设置视频外的背景为黑色
mVideoWidget->setAutoFillBackground(true);
QPalette palette(QPalette::Window, QColor(0,0,0));
mVideoWidget->setPalette(palette);
connect(mPlayer,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(OnStateChanged(QMediaPlayer::State)));
connect(mPlayer,SIGNAL(positionChanged(qint64)),this,SIGNAL(positionChanged(qint64)));
connect(mPlayer,SIGNAL(durationChanged(qint64)),this,SIGNAL(durationChanged(qint64)));
}
VideoWidget::~VideoWidget()
{
delete mPlayer;
delete mVideoWidget;
}
void VideoWidget::init()
{
}
void VideoWidget::setVideoName(QString name)
{
mPlayer->setMedia(QUrl::fromLocalFile(name)); //给播放器设置视频路劲
videoName = name;
}
QString VideoWidget::getVideoName()
{
return videoName;
}
bool VideoWidget::play()
{
if(videoName.isEmpty())
return 0;
mPlayer->play();
return 1;
}
bool VideoWidget::pause()
{
if(mState != QMediaPlayer::PlayingState)
return 0;
mPlayer->pause();
return 1;
}
bool VideoWidget::stop()
{
if(mState == QMediaPlayer::StoppedState)
return 0;
mPlayer->stop();
return 1;
}
void VideoWidget::setPlaySpeed(double speed)
{
mPlayer->setPlaybackRate(speed); //设置播放速度
}
quint64 VideoWidget::getDuration()
{
return mPlayer->duration();
}
bool VideoWidget::setPlayPos(quint64 position)
{
if(mState == QMediaPlayer::StoppedState)
return 0;
mPlayer->setPosition(position);
return 1;
}
quint64 VideoWidget::getCurrentPlyPos()
{
return mPlayer->position(); //返回播放位置值
}
void VideoWidget::setVideoBackColor(QColor color)
{
QPalette palette(QPalette::Window, color);
this->setPalette(palette);
}
void VideoWidget::OnStateChanged(QMediaPlayer::State enumState)
{
mState = enumState; //获取状态
emit stateChanged(enumState); //对外发送状态
}
void VideoWidget::resizeEvent(QResizeEvent *event)
{
mVideoWidget->setGeometry(0,0,this->width(),this->height());
}
3、demo设计
pro文件记得添加模块:
QT += core gui multimedia multimediawidgets
mainwindows界面设计如下:
然后对按钮等控件都添加信号槽,widget提升为设计好的VideoWidget
类
h文件就不贴了,mainwindows.cpp代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_select_clicked()
{
QFileDialog dialog(this); //打开一个文件选择窗口
dialog.setFileMode(QFileDialog::AnyFile); //设置任意文件可选
QStringList fileNames;
if (dialog.exec())
fileNames = dialog.selectedFiles(); //获取选择的文件链表
if(!fileNames.empty())
ui->widget->setVideoName(fileNames.at(0)); //给播放器设置视频路劲
}
void MainWindow::on_pushButton_start_clicked()
{
ui->widget->play();
}
void MainWindow::on_pushButton_pause_clicked()
{
ui->widget->pause();
}
void MainWindow::on_pushButton_stop_clicked()
{
ui->widget->stop();
}
void MainWindow::on_comboBox_speed_currentIndexChanged(int index)
{
if(index == 0) ui->widget->setPlaySpeed(0.5);
else if(index == 1) ui->widget->setPlaySpeed(0.75);
else if(index == 2) ui->widget->setPlaySpeed(0.1);
else if(index == 3) ui->widget->setPlaySpeed(1.25);
else if(index == 4) ui->widget->setPlaySpeed(1.5);
else if(index == 5) ui->widget->setPlaySpeed(2);
}