效果

在这里插入图片描述

功能

  • 进度条更新及拖动定位视频
  • 播放暂停
  • 音量增减
  • 快进,快退

环境

  • 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;
	}
}

注意事项

  1. 安装音视频解码插件
  2. vs环境Modules 添加multimedia;multimediawidgets
  3. Qtcreator中.pro文件中添加multimedia;multimediawidgets
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐