一、演示效果
二、关键内容
#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