QT简易视频播放器

videoplayer.cpp

#ifndef VEDIOWINDOW_H
#define VEDIOWINDOW_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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 
#include 
#include 
#include 


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();
}

白色部分为视频播放窗口,支持播放,进度条,暂停停止,点击播放列表播放,但是部分需要自己改,比如获取视频列表的路径啥的
QT简易视频播放器_第1张图片

你可能感兴趣的:(QT,C++)