一、开始
1、准备
最近学了C++以及Qt,做个播放器练手,打算先完成基础功能,之后再完善程序。
我使用的是Qt5,要使用QMediaPlayer等文件需要修改.pro文件:
QT += core gui multimedia multimediawidgets
使用媒体文件解析器
LAVFilters解码器 下载链接:https://github.com/Nevcairiel/LAVFilters/releases
2、设计思路,基本功能实现
(1)打开文件并播放;
(2)按钮控制播放和停止;
(3)设置音量;
(4)设置进度条;
二、ui设计
三、程序设计
头文件使用:
#include < QMainWindow >
#include < QMediaPlayer >
#include < QVideoWidget >
#include < QDebug >
#include < QFileDialog >
#include < QSlider >
#include “mouseslider.h”
1、打开一个多媒体文件
//打开文件,并在左下角显示名称
connect(ui->pushButton_Add,&QPushButton::clicked,this,&MainWindow::openFile);
void MainWindow::openFile()
{
ui->widget_Screen->setAttribute(Qt::WA_DeleteOnClose);
//打开文件,获取文件绝对路径,并且进行多媒体文件过滤
QString mediaPath = QFileDialog::getOpenFileName(
this,“open”,“…/”,“mp4(.mp4);;avi(.avi);;mkv(.mkv);;all(.*)”);
if (mediaPath.isEmpty())
return;
//qDebug() << mediaPath;
//右下角显示文件名称
QFileInfo fileInfo(mediaPath);
ui->label_currentName->setText(fileInfo.fileName());
//开始播放
playList();
}
2、开始播放
void MainWindow::playList()
{
//视频播放
m_Player = new QMediaPlayer(this);
m_Player->setVideoOutput(ui->widget_Screen);//视频输出到QVideoWidget
// ui->widget_Screen->setFullScreen(true); //全屏显示
m_Player->setMedia(QUrl::fromLocalFile(mediaPath));//加载视频文件
m_Player->play();//播放视频
mediaPath.clear();
//设置初始音量
m_Player->setVolume(50);
ui->horizontalSlider_sound->setValue(50);
//进度条增长
connect(m_Player,&QMediaPlayer::durationChanged,this,&MainWindow::initStep);
connect(m_Player,&QMediaPlayer::positionChanged,this,&MainWindow::stepChange);
}
3、按键控制(播放、暂停、设置音量)
//播放
connect(ui->pushButton_Play,&QPushButton::clicked,this,&MainWindow::buttonPlay);
//暂停
connect(ui->pushButton_Pause,&QPushButton::clicked,this,&MainWindow::buttonPause);
//手动设置音量
connect(ui->horizontalSlider_sound,&QSlider::sliderReleased,this,&MainWindow::soundChange);
void MainWindow::buttonPlay()
{
m_Player->play();//播放视频
}
void MainWindow::buttonPause()
{
m_Player->pause();//暂停视频
}
void MainWindow::soundChange()
{
m_Player->setVolume(ui->horizontalSlider_sound->value());//设置音量
}
4、进度条设置(鼠标事件修改)
protected:
void mousePressEvent(QMouseEvent *ev) override;
signals:
void mySignal(qint64);
void mouseSlider::mousePressEvent(QMouseEvent *ev)
{
int currentX = ev->pos().x();
int value;
//获取此时鼠标对应位置的滑块值
double per = currentX 1.0 /this->width();
value = per(this->maximum() - this->minimum()) + this->minimum();
//设置滑块值
// this->setValue(value);
emit mySignal(value);
}
//鼠标按下后,获得在滑条上的位置,滑块跟随鼠标来到这个位置
connect(ui->horizontalSlider_videaPose,&mouseSlider::mySignal,this,&MainWindow::setStep);
void MainWindow::setStep(qint64 value)
{
//qDebug() << str;
m_Player->setPosition(value);//设置播放位置
m_Player->play();//播放视频
}
四、存在的问题
1、连续打开多个文件时,前一个文件无法关闭;
2、在未打开文件时,设置音量和进度条会程序中止;