videoplayer.cpp
#ifndef VEDIOWINDOW_H
#define VEDIOWINDOW_H
#include <QMainWindow>
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QFileDialog>
#include <QMediaPlaylist>
#include <QStandardItemModel>
#include <QListView>
#include <QStringListModel>
#include <QTimer>
#include <QSlider>
#include <QMouseEvent>
class VedioSlider : public QSlider
{
Q_OBJECT
public:
VedioSlider(QWidget *parent = 0) : QSlider(parent)
{
}
protected:
void mousePressEvent(QMouseEvent *ev);//重写QSlider的mousePressEvent事件
signals:
void costomSliderClicked();//自定义的鼠标单击信号,用于捕获并处理
};
class VedioWindow : public QMainWindow
{
Q_OBJECT
public:
explicit VedioWindow(QWidget *parent = 0);
~VedioWindow();
private:
QMediaPlayer *player;
QVideoWidget *videoWidget;
QMediaPlaylist *Playlist;
QString m_fileName;
QMediaPlayer::State m_playerState;
QStringListModel *Model;
QStandardItemModel *ItemModel;
QListView* listView;
VedioSlider* sliderDuration;
QTimer* timer;
private slots:
void playVideo();
void stopVideo();
void showClick(QModelIndex index);
void sliderProgressClicked();
void sliderProgressMoved();
void sliderProgressReleased();
void onTimerOut();
void openAudio();
void pauseAudio();
};
#endif // !VEDIOWINDOW_H
videoplayer.h
#include "vedioWindow.h"
#include <QBoxLayout>
#include <QPushButton>
#include <QSlider>
#include <QStatusBar>
VedioWindow::VedioWindow(QWidget *parent) :
m_playerState(QMediaPlayer::StoppedState)
{
QPushButton* playAudio = new QPushButton(QStringLiteral("播放"));
QPushButton* pauseAudio = new QPushButton(QStringLiteral("暂停"));
QPushButton* stopAudio = new QPushButton(QStringLiteral("停止"));
sliderDuration = new VedioSlider();
sliderDuration->setOrientation(Qt::Horizontal);
QWidget *widget = new QWidget;
widget->resize(500, 500);
this->setCentralWidget(widget);
player = new QMediaPlayer;
Playlist = new QMediaPlaylist();
player->setPlaylist(Playlist);
videoWidget = new QVideoWidget(widget);
videoWidget->setAspectRatioMode(Qt::IgnoreAspectRatio);
player->setVideoOutput(videoWidget);
//水平布局,控制按钮
QBoxLayout *ctlLayout = new QHBoxLayout;
ctlLayout->addWidget(playAudio);
ctlLayout->addWidget(pauseAudio);
ctlLayout->addWidget(stopAudio);
//播放列表组件初始化、和播放窗口布局
listView = new QListView;
QBoxLayout *ctlLayout1 = new QHBoxLayout;
ctlLayout1->addWidget(videoWidget);
ctlLayout1->addWidget(listView);
//垂直布局:视频播放器、进度条、控制按钮布局
QStatusBar* statusbar = new QStatusBar();
QBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(ctlLayout1);
mainLayout->addStretch();
mainLayout->addWidget(sliderDuration);
mainLayout->addLayout(ctlLayout);
mainLayout->addStretch();
//设置布局
widget->setLayout(mainLayout);
//播放列表数据添加
ItemModel = new QStandardItemModel(this);
QStringList strList;
QDir dir(QDir::currentPath() += "/images/screenVideo/");
QStringList nameFilters;
nameFilters << "*.avi";
QFileInfoList fileInfoList = dir.entryInfoList(nameFilters, QDir::Files | QDir::Readable, QDir::Name);
for (QFileInfo fileInfo : fileInfoList) {
QString string = static_cast<QString>(fileInfo.fileName());
QStandardItem *item = new QStandardItem(string);
ItemModel->appendRow(item);
}
listView->setModel(ItemModel);
listView->setFixedSize(200, 500);
//默认播放最后一个视频
int nCount = fileInfoList.size();
QString _vName = QString::number(nCount);
QString vName = QDir::currentPath() += "/images/screenVideo/PlayBack" + _vName + ".avi";
player->setMedia(QUrl::fromLocalFile(vName));
player->setVolume(60);
openAudio();
player->play();
//信号槽
QObject::connect(playAudio, SIGNAL(clicked()), this, SLOT(playVideo()));
QObject::connect(stopAudio, SIGNAL(clicked()), this, SLOT(stopVideo()));
QObject::connect(pauseAudio, SIGNAL(clicked()), this, SLOT(pauseAudio()));
QObject::connect(listView, SIGNAL(clicked(QModelIndex)), this, SLOT(showClick(QModelIndex)));
QObject::connect(sliderDuration, SIGNAL(costomSliderClicked()), this, SLOT(sliderProgressClicked()));
QObject::connect(sliderDuration, SIGNAL(sliderMoved()), this, SLOT(sliderProgressMoved()));
QObject::connect(sliderDuration, SIGNAL(sliderReleased()), this, SLOT(sliderProgressReleased()));
this->resize(800, 300);
}
void VedioWindow::showClick(QModelIndex index)
{
QString strTemp;
strTemp = index.data().toString();
QString path = QDir::currentPath();//当前工作路径
QString videopath = path + "/images/screenVideo/" + strTemp;
player->setMedia(QUrl::fromLocalFile(videopath));
player->setVolume(60);
openAudio();
player->play();
}
void VedioWindow::openAudio()
{
timer = new QTimer();
timer->setInterval(1000);
timer->start();
sliderDuration->setRange(0, 1000);
//将timer连接至onTimerOut槽函数
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(onTimerOut()));
}
VedioWindow::~VedioWindow()
{
}
void VedioWindow::playVideo()
{
m_playerState = QMediaPlayer::PlayingState;
player->play();
}
void VedioWindow::pauseAudio()
{
//pauseFlag = true;
//time.stop();
if (player == NULL)
{
return;
}
player->pause();
}
void VedioWindow::stopVideo()
{
m_playerState = QMediaPlayer::StoppedState;
player->stop();
}
void VedioWindow::onTimerOut()
{
if (player == NULL)
{
return;
}
int duration = player->duration();
if (duration == 0) {
duration = 1;
}
int _time = player->position() * 1000 / duration;
if (_time <= 0)
{
_time = 0;
}
else if (_time >= 1000)
{
_time = 1000;
}
sliderDuration->setValue(_time);
}
//单击、拖动、释放
void VedioWindow::sliderProgressClicked()
{
if (player == NULL)
{
return;
}
player->setPosition(sliderDuration->value()*player->duration() / 1000);
}
void VedioWindow::sliderProgressMoved()
{
//暂时停止计时器,在用户拖动过程中不修改slider的值
if (player == NULL)
{
return;
}
timer->stop();
player->setPosition(sliderDuration->value()*player->duration() / 1000);
}
void VedioWindow::sliderProgressReleased()
{
//用户释放滑块后,重启定时器
if (timer == NULL)
{
return;
}
timer->start();
}
void VedioSlider::mousePressEvent(QMouseEvent* ev)
{
//注意应先调用父类的鼠标点击处理事件,这样可以不影响拖动的情况
QSlider::mousePressEvent(ev);
//获取鼠标的位置,这里并不能直接从ev中取值(因为如果是拖动的话,鼠标开始点击的位置没有意义了)
double pos = ev->pos().x() / (double)width();
setValue(pos * (maximum() - minimum()) + minimum());
//发送自定义的鼠标单击信号
emit costomSliderClicked();
}
白色部分为视频播放窗口,支持播放,进度条,暂停停止,点击播放列表播放,但是部分需要自己改,比如获取视频列表的路径啥的