39 lines
1.5 KiB
C++
39 lines
1.5 KiB
C++
#include "elevideo.h"
|
|
#include "tools.h"
|
|
#include <QGraphicsVideoItem>
|
|
#include <QMediaPlaylist>
|
|
#include <QMessageBox>
|
|
#include <libavcodec/avcodec.h>
|
|
#include <libavformat/avformat.h>
|
|
#include <libswscale/swscale.h>
|
|
#include <libavutil/imgutils.h>
|
|
|
|
EleVideo::EleVideo(QString path, int w, int h, QWidget *parent) : QGraphicsView{parent} {
|
|
setFrameStyle(QFrame::NoFrame);
|
|
setScene(new QGraphicsScene(this));
|
|
setBackgroundBrush(QColor(0,0,0));
|
|
auto videoItem = new QGraphicsVideoItem();
|
|
videoItem->setSize(QSize(w,h));
|
|
videoItem->setAspectRatioMode(Qt::IgnoreAspectRatio);
|
|
scene()->addItem(videoItem);
|
|
player = new QMediaPlayer(videoItem);
|
|
player->setVideoOutput(videoItem);
|
|
connect(player, &QMediaPlayer::mediaStatusChanged, this, [this](QMediaPlayer::MediaStatus status){
|
|
if(status==QMediaPlayer::EndOfMedia) {
|
|
if(player->state() != QMediaPlayer::PlayingState && isVisible()) player->play();
|
|
}
|
|
});
|
|
void(QMediaPlayer::*player_error)(QMediaPlayer::Error) = &QMediaPlayer::error;
|
|
connect(player, player_error, this, [this](QMediaPlayer::Error error){
|
|
QMessageBox::critical(this, "Video Error", Tools::playerErrStr(error)+": "+player->errorString());
|
|
});
|
|
player->setMedia(QUrl::fromLocalFile(path));
|
|
}
|
|
|
|
void EleVideo::showEvent(QShowEvent *) {
|
|
if(player!=nullptr && player->state() != QMediaPlayer::PlayingState) player->play();
|
|
}
|
|
void EleVideo::hideEvent(QHideEvent *) {
|
|
if(player!=nullptr) player->stop();
|
|
}
|