QT-VLC视频播放器(播放暂停-调音量-进度条)

QT-VLC视频播放器(播放暂停-调音量-进度条)

一、演示效果

请添加图片描述

请添加图片描述

二、关键内容

#include "ClassVideoWidget.h"
#include <QDateTime>
#include <QJsonDocument>
#include "QTextCodec"
#include <QTimer>
#include <QMenu>
#include <QFileDialog>

ClassVideoWidget::ClassVideoWidget(QWidget *parent)
	: QWidget(parent)
	, m_player(nullptr)
	, m_thread(nullptr)
{
	setWindowFlags(Qt::FramelessWindowHint);
	ui.setupUi(this);

	ui.videoStackedWidget->setCurrentIndex(0);

	initPlayer();
}

ClassVideoWidget::~ClassVideoWidget()
{
	if (m_player)
	{
		m_player->Release();
	}
	if (m_thread)
	{
		m_thread->quit();
		m_thread->wait();
	}
}

void ClassVideoWidget::initPlayer()
{
	m_player = new VlcPlayer(this);
	m_thread = new QThread(this);
	m_player->moveToThread(m_thread);
	m_thread->start();
	m_player->initVlc();

	connect(m_player, SIGNAL(playAllTime(int)), this, SLOT(onVlcMediaPlayerVount(int)));
	connect(m_player, SIGNAL(playCurrentTime(int)), this, SLOT(onVlcMediaPlayerTimeChange(int)));
	
	// 播放进度
	connect(ui.videoSeekSlider, &WCSlider::sliderReleasedAt, [=](int currentPrecent) {
		if (m_player)
		{
			m_player->SetPlayTime(currentPrecent * 1000);
		}
	});

	// 音量进度
	connect(ui.videoVolumnSlider, &WCSlider::sliderReleasedAt, [=](int currentPrecent) {
		if (m_player)
		{
			m_player->SetVolume(currentPrecent);
		}
	});

	// 音量进度
	connect(ui.videoMax, &QPushButton::clicked, [=]() {
		if (this->isMaximized())
		{
			this->showNormal();
		}
		else
		{
			this->showMaximized();
			
		}
	});
	
	// 加载视频
	QTimer::singleShot(1000, [=]() {
		if (m_strCurrentVedio.isEmpty())
		{
			//QString url = "https://vod.pipi.cn/43903a81vodtransgzp1251246104/bbd4f07a5285890808066187974/v.f42906.mp4";

			//m_player->PlayUrl(url, (void*)ui.videoWidget->winId());

			//m_player->Play(url, (void*)ui.videoWidget->winId());
		}
		else
		{
			m_player->PlayUrl(m_strCurrentVedio, (void*)ui.videoWidget->winId());
		}

	});


}

void ClassVideoWidget::contextMenuEvent(QContextMenuEvent *event)
{
	// 右键菜单
	QMenu menu(ui.listWidget);
	QAction *pActionOpen = menu.addAction(u8"选择视频文件");
	connect(pActionOpen, &QAction::triggered, this, &ClassVideoWidget::onOption1Clicked);
	menu.exec(event->globalPos());
}

void ClassVideoWidget::onOption1Clicked()
{
	// 处理选项1的操作
	QString fileName = QFileDialog::getOpenFileName(this, tr(u8"打开视频"), "", tr(u8"视频文件 (*.mp4  *.avi *.wmv *.mpeg *.mp4 *.m4v *.mov *.asf *.flv *.f4v *.rmvb *.rm *.3gp *.vob );;所有文件 (*)"));
	if (!fileName.isEmpty()) 
	{
		m_strCurrentVedio = fileName;
		m_player->Play(fileName, (void*)ui.videoWidget->winId());
		QFileInfo info(fileName);
		ui.listWidget->addItem(info.fileName());
	}
}

void ClassVideoWidget::onOption2Clicked()
{
	// 处理选项2的操作
}

void ClassVideoWidget::onOption3Clicked()
{
	// 处理选项3的操作
}

void ClassVideoWidget::updateTime(int currentTime)
{
	QString currentMin = currentTime / 60 < 10 ? QString("0%1").arg(currentTime / 60) : QString::number(currentTime / 60);
	QString currentSecond = currentTime % 60 < 10 ? QString("0%1").arg(currentTime % 60) : QString::number(currentTime % 60);
	QString totalMin = m_totalTime / 60 < 10 ? QString("0%1").arg(m_totalTime / 60) : QString::number(m_totalTime / 60);
	QString totalSecond = m_totalTime % 60 < 10 ? QString("0%1").arg(m_totalTime % 60) : QString::number(m_totalTime % 60);
	ui.videoTime->setText(QString("%1:%2/%3:%4").arg(currentMin).arg(currentSecond).arg(totalMin).arg(totalSecond));
	// 刷新进度条
	ui.videoSeekSlider->setValue(currentTime);

	if (currentTime == m_totalTime)
	{
		// 播放结束
		m_isFinishPlay = true;
		ui.videoPause->setChecked(true);
	}
}

int ClassVideoWidget::volumn()
{
	return m_player->GetVolume();
}

int ClassVideoWidget::playTime()
{
	if (m_player)
	{
		return m_player->GetPlayTime();
	}
	return 0;
}

bool ClassVideoWidget::isPlaying()
{
	return m_player->IsPlaying();
}

bool ClassVideoWidget::isFinishPlaying()
{
	return m_player->IsEndPlaying();
}

void ClassVideoWidget::onVlcMediaPlayerVount(int count)
{
	// 说明是第一次进入视频
	if (ui.videoStackedWidget->currentIndex() != 1)
	{
		// 跳转到播放界面
		ui.videoStackedWidget->setCurrentIndex(1);
		// 设置视频当前音量
		m_lastVolumn = 100;
		ui.videoVolumnSlider->setValue(m_lastVolumn);
		// 保存视频的总长度
		m_totalTime = m_player->GetTime() / 1000;
		ui.videoSeekSlider->setMaximum(m_totalTime);
		updateTime(0);
		// 默认视频不自动播放,需要用户点击
		m_player->Pause();
	}
}

void ClassVideoWidget::onVlcMediaPlayerTimeChange(int currentTime)
{
	updateTime(currentTime);
}

void ClassVideoWidget::onVlcMediaPlayerEnd()
{
}

void ClassVideoWidget::on_videoPause_clicked()
{
	if (ui.videoPause->isChecked())
	{
		m_player->Pause();
	}
	else
	{
		if (m_isFinishPlay)
		{
			m_player->StopPlaying();
			m_isFinishPlay = false;
		}
		m_player->Play();
	}
}

void ClassVideoWidget::on_videoVolumn_clicked()
{
	if (ui.videoVolumn->isChecked())
	{
		ui.videoVolumnSlider->setValue(0);
		// 设置视频当前音量
		m_lastVolumn = m_player->GetVolume();
		m_player->SetVolume(0);
	}
	else
	{
		// 设置视频当前音量
		ui.videoVolumnSlider->setValue(m_lastVolumn);
		m_player->SetVolume(m_lastVolumn);
	}
}

void ClassVideoWidget::on_videoClose_clicked()
{
	if (m_player)
	{
		m_player->Stop();
	}
	close();
}

三、链接下载

https://download.csdn.net/download/u013083044/88069048?spm=1001.2014.3001.5503

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的大海贼

联系博主,为您提供有价值的资源

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值