130 lines
4.0 KiB
C++
130 lines
4.0 KiB
C++
#include "videoplayer.h"
|
||
#include <QDir>
|
||
#include <QTimer>
|
||
|
||
|
||
|
||
VideoPlayer::VideoPlayer(QWidget *parent) :
|
||
QWidget(parent)
|
||
{
|
||
player = new QMediaPlayer(this);
|
||
connect(player, &QMediaPlayer::positionChanged,
|
||
this, &VideoPlayer::updatePosition);
|
||
|
||
connect(player, &QMediaPlayer::mediaStatusChanged,
|
||
this, &VideoPlayer::mediaStatusChanged);
|
||
connect(player, static_cast<void(QMediaPlayer::*)(QMediaPlayer::Error)>
|
||
(&QMediaPlayer::error), this, &VideoPlayer::showError);
|
||
}
|
||
|
||
|
||
VideoPlayer::~VideoPlayer()
|
||
{
|
||
if(player != nullptr)
|
||
{
|
||
player->stop();
|
||
player->deleteLater();
|
||
player = nullptr;
|
||
}
|
||
|
||
}
|
||
|
||
void VideoPlayer::setOutput(QGraphicsVideoItem *videoWidget, int duration)
|
||
{
|
||
video_Duration = duration;
|
||
player->setVideoOutput(videoWidget);
|
||
player->setMuted(true); //视频静音
|
||
player->setPosition(1); //避免首次打开视频是黑屏
|
||
player->play();
|
||
}
|
||
|
||
void VideoPlayer::setMediaFile(QString filePath)
|
||
{
|
||
m_filePath = filePath;
|
||
player->setMedia(QMediaContent(QUrl::fromLocalFile(filePath)));
|
||
}
|
||
|
||
void VideoPlayer::updatePosition(qint64 position)
|
||
{
|
||
//因为用wps制作的视频用qmediaplayer去获取视频时长有问题,会在视频最后一帧停留很长时间,所以用ffmpeg获取视频时长,手动循环播放视频
|
||
qDebug() << "position =" << position << "player->duration() = " << player->duration() << "duration = " << video_Duration;
|
||
if (video_Duration || player->duration()) {
|
||
if (position && position > (video_Duration > 0 ? video_Duration : player->duration())) {
|
||
player->setMedia(QMediaContent(QUrl::fromLocalFile(m_filePath)));
|
||
player->setPosition(1);
|
||
player->play();
|
||
} else if (position == 0 && player->duration()) { //有些wps做的视频播放到最后一帧会自己跳到0
|
||
player->setMedia(QMediaContent(QUrl::fromLocalFile(m_filePath)));
|
||
player->setPosition(1);
|
||
player->play();
|
||
} else if (position && position == video_Duration) {//视频当前播放帧数 = 视频总时长
|
||
player->setMedia(QMediaContent(QUrl::fromLocalFile(m_filePath)));
|
||
player->setPosition(1);
|
||
player->play();
|
||
}
|
||
}
|
||
}
|
||
|
||
void VideoPlayer::mediaStatusChanged(QMediaPlayer::MediaStatus status)
|
||
{
|
||
switch (status) {
|
||
case QMediaPlayer::UnknownMediaStatus:
|
||
qDebug() << "UnknownMediaStatus!!!" ;
|
||
break;
|
||
case QMediaPlayer::NoMedia:
|
||
qDebug() << "NoMedia!!!" ;
|
||
break;
|
||
case QMediaPlayer::BufferingMedia:
|
||
qDebug() << "BufferingMedia!!!" ;
|
||
break;
|
||
case QMediaPlayer::BufferedMedia:
|
||
qDebug() << "The player has fully buffered the current media!!!" ;
|
||
break;
|
||
case QMediaPlayer::LoadingMedia:
|
||
qDebug() << "LoadingMedia!!!" ;
|
||
break;
|
||
case QMediaPlayer::StalledMedia:
|
||
qDebug() << "StalledMedia!!!" ;
|
||
break;
|
||
case QMediaPlayer::EndOfMedia:
|
||
qDebug() << "EndOfMedia!!!" ;
|
||
// player->setPosition(0);
|
||
// player->play();
|
||
break;
|
||
case QMediaPlayer::LoadedMedia:
|
||
qDebug() << "LoadedMedia!!!" ;
|
||
break;
|
||
case QMediaPlayer::InvalidMedia:
|
||
qDebug() << "InvalidMedia!!!" ;
|
||
break;
|
||
default: break;
|
||
}
|
||
}
|
||
|
||
void VideoPlayer::showError(QMediaPlayer::Error error)
|
||
{
|
||
switch (error) {
|
||
case QMediaPlayer::NoError:
|
||
qDebug() << "没有错误!" ;
|
||
break;
|
||
case QMediaPlayer::ResourceError:
|
||
qDebug() << "媒体资源无法被解析!";
|
||
break;
|
||
case QMediaPlayer::FormatError:
|
||
qDebug() << "不支持该媒体格式!";
|
||
break;
|
||
case QMediaPlayer::NetworkError:
|
||
qDebug() << "发生了一个网络错误!";
|
||
break;
|
||
case QMediaPlayer::AccessDeniedError:
|
||
qDebug() << "没有播放权限!";
|
||
break;
|
||
case QMediaPlayer::ServiceMissingError:
|
||
qDebug() << "没有发现有效的播放服务!";
|
||
break;
|
||
default: break;
|
||
}
|
||
}
|
||
|
||
|