简易音视频播放器,及异常捕获
效果功能进度条更新及拖动定位视频播放暂停音量增减快进,快退环境win10qt5.9.5vs2015实现ui设计.h文件#pragma once#include <QMediaPlayer>//媒体播放#include <QVideoWidget>//媒体显示#include <QTime>#include <QVBoxLayout>#include
·
效果

功能
- 进度条更新及拖动定位视频
- 播放暂停
- 音量增减
- 快进,快退
环境
- win10
- qt5.9.5
- vs2015
实现
ui设计

.h文件
#pragma once
#include <QMediaPlayer> //媒体播放
#include <QVideoWidget> //媒体显示
#include <QTime>
#include <QVBoxLayout>
#include "ui_MediaPlayer.h"
class MediaPlayer : public QWidget
{
Q_OBJECT
public:
MediaPlayer(QWidget *parent = Q_NULLPTR);
~MediaPlayer();
void InitPlayer();
void UpdateProgress();//更新进度条
void UpdateTotalTime();//更新总时长
private slots:
void on_toolButton_player_clicked();//播放暂停槽函数
void on_toolButton_rewind_clicked();//快退槽函数
void on_toolButton_forward_clicked();//快进槽函数
void on_horizontalSlider_volume_valueChanged(int value);//音量条滑动
void on_horizontalSlider_sliderMoved(int position);//进度条拖动
void on_video_play_error_handled(QMediaPlayer::Error error);
//音视频播放状态异常处理
void media_Status_changed(QMediaPlayer::MediaStatus status);
private:
Ui::MediaPlayerClass ui;
QMediaPlayer *m_Player;//音视频播放暂停属性
QVideoWidget *m_VideoWidget;//视频显示属性
QVBoxLayout *m_VBoxLayout;//垂直布局
};
.cpp文件
#include "MediaPlayer.h"
MediaPlayer::MediaPlayer(QWidget *parent)
: QWidget(parent),
m_Player(NULL),
m_VideoWidget(NULL),
m_VBoxLayout(NULL)
{
ui.setupUi(this);
InitPlayer();
}
MediaPlayer::~MediaPlayer()
{
if (NULL!=m_Player)
{
delete m_Player;
m_Player = NULL;
}
if (NULL!=m_VideoWidget)
{
delete m_VideoWidget;
m_VideoWidget = NULL;
}
if (m_VBoxLayout!=NULL)
{
delete m_VBoxLayout;
m_VBoxLayout = NULL;
}
}
void MediaPlayer::InitPlayer()
{
QString path = QString::fromLocal8Bit("E:\\360MoveData\\Users\\jill\\Desktop\\QTcode\\Client\\MV.mp4");//本地文件
if (NULL==m_Player)
{
m_Player = new QMediaPlayer;
}
if (m_VideoWidget == NULL && m_VBoxLayout == NULL)
{
m_VideoWidget = new QVideoWidget;//设置播放位置 ui.widget_video
m_VBoxLayout = new QVBoxLayout(ui.widget);//设置垂直布局
m_VBoxLayout->setContentsMargins(0, 0, 0, 0);//设置边框
m_VBoxLayout->addWidget(m_VideoWidget);//添加对象
m_Player->setVideoOutput(m_VideoWidget);//设置播放输出
}
if (m_Player == NULL || m_VideoWidget == NULL)
{
return;
}
m_Player->setMedia(QUrl::fromLocalFile(path));//设置媒体播放路径
m_VideoWidget->show();
m_Player->setVolume(ui.horizontalSlider_volume->value());//初始化音量
ui.label->setText(QString::number(ui.horizontalSlider_volume->value()));//初始化音量显示
m_Player->pause(); //初始化停止播放
ui.label_current_time->setText("00:00:00");
ui.label_total_time->setText("/00:00:00");
ui.toolButton_player->setText("PLAY");
//音视频当前位置改变信号槽,更新进度条
connect(m_Player, &QMediaPlayer::positionChanged, this, &MediaPlayer::UpdateProgress);
//音视频总时长改变信号槽(切换媒体),更新总时长
connect(m_Player, &QMediaPlayer::durationChanged, this, &MediaPlayer::UpdateTotalTime);
connect(m_Player, static_cast<void(QMediaPlayer::*)(QMediaPlayer::Error)>(&QMediaPlayer::error), this, &MediaPlayer::on_video_play_error_handled);//音视频播放异常处理
connect(m_Player, &QMediaPlayer::mediaStatusChanged, this, &MediaPlayer::media_Status_changed); //状态改变异常处理
return;
}
//播放暂停按钮槽函数
void MediaPlayer::on_toolButton_player_clicked()
{
switch (m_Player->state()) {
case QMediaPlayer::PlayingState:
ui.toolButton_player->setText("PLAY");
m_Player->pause();
break;
default:
ui.toolButton_player->setText("PAUSE");
m_Player->play();
break;
}
}
//更新进度条
void MediaPlayer::UpdateProgress()
{
ui.horizontalSlider->setRange(0, m_Player->duration());
quint64 currentPosition = m_Player->position();
ui.horizontalSlider->setValue(currentPosition);
QTime currentTime;
currentTime.setHMS(0, m_Player->position() / 60000, qRound((m_Player->position() % 60000) / 1000.0));
ui.label_current_time->setText(currentTime.toString("hh:mm:ss"));
return;
}
//更新总时长
void MediaPlayer::UpdateTotalTime()
{
QTime totalTime;
totalTime.setHMS(0, m_Player->duration() / 60000, qRound((m_Player->duration() % 60000) / 1000.0));
ui.label_total_time->setText("/" + totalTime.toString("hh:mm:ss"));
return;
}
//快退
void MediaPlayer::on_toolButton_rewind_clicked()
{
int currentTime = m_Player->position();//-=5000;
currentTime -= 5000;
if (currentTime <= 0)
{
m_Player->setPosition(0);
}
else {
m_Player->setPosition(currentTime);
}
return;
}
//快进
void MediaPlayer::on_toolButton_forward_clicked()
{
int currentTime = m_Player->position();//+=5000;
currentTime += 5000;
if (currentTime >= m_Player->duration())
{
m_Player->setPosition(m_Player->duration());
}
m_Player->setPosition(currentTime);
return;
}
//音量条滑动槽函数
void MediaPlayer::on_horizontalSlider_volume_valueChanged(int value)
{
m_Player->setVolume(value);
ui.label->setText(QString::number(value));
return;
}
//进度条滑动槽函数
void MediaPlayer::on_horizontalSlider_sliderMoved(int position)
{
m_Player->setPosition(position);
return;
}
//播放中异常处理
void MediaPlayer::on_video_play_error_handled(QMediaPlayer::Error error)
{
switch (error)
{
case QMediaPlayer::NoError:
break;
case QMediaPlayer::ResourceError: //文件源错误,文件不存在
ui.toolButton_player->setEnabled(false);
break;
case QMediaPlayer::FormatError:
break;
case QMediaPlayer::NetworkError:
break;
case QMediaPlayer::AccessDeniedError:
break;
case QMediaPlayer::ServiceMissingError:
break;
case QMediaPlayer::MediaIsPlaylist:
break;
default:
break;
}
}
//播放状态异常处理
void MediaPlayer::media_Status_changed(QMediaPlayer::MediaStatus status)
{
switch (status)
{
case QMediaPlayer::UnknownMediaStatus: //此状态就是用来捕获未安装视频解码器
qDebug() << "no decoder installed";
break;
case QMediaPlayer::NoMedia:
break;
case QMediaPlayer::LoadingMedia:
break;
case QMediaPlayer::LoadedMedia:
break;
case QMediaPlayer::StalledMedia:
break;
case QMediaPlayer::BufferingMedia:
break;
case QMediaPlayer::BufferedMedia:
break;
case QMediaPlayer::EndOfMedia:
break;
case QMediaPlayer::InvalidMedia:
break;
default:
break;
}
}
注意事项
- 安装音视频解码插件
- vs环境Modules 添加multimedia;multimediawidgets
- Qtcreator中.pro文件中添加multimedia;multimediawidgets
更多推荐

所有评论(0)