/**
|
* Ò¶º£»Ô
|
* QQȺ121376426
|
* http://blog.yundiantech.com/
|
*/
|
|
#include "MainWindow.h"
|
#include "ui_MainWindow.h"
|
|
#include <QPainter>
|
#include <QPaintEvent>
|
#include <QFileDialog>
|
#include <QDebug>
|
#include <QDesktopWidget>
|
#include <QFontDatabase>
|
#include <QMouseEvent>
|
#include <QMessageBox>
|
|
#include "AppConfig.h"
|
#include "Base/FunctionTransfer.h"
|
|
#include "Widget/SetVideoUrlDialog.h"
|
|
Q_DECLARE_METATYPE(VideoPlayerState)
|
|
MainWindow::MainWindow(QWidget *parent) :
|
DragAbleWidget(parent),
|
ui(new Ui::MainWindow)
|
{
|
ui->setupUi(this->getContainWidget());
|
|
FunctionTransfer::init(QThread::currentThreadId());
|
|
///³õʼ»¯²¥·ÅÆ÷
|
// VideoPlayer::initPlayer();
|
|
setWindowFlags(Qt::FramelessWindowHint);//|Qt::WindowStaysOnTopHint); //ʹ´°¿ÚµÄ±êÌâÀ¸Òþ²Ø
|
// setAttribute(Qt::WA_TranslucentBackground);
|
|
//ÒòΪVideoPlayer::PlayerStateÊÇ×Ô¶¨ÒåµÄÀàÐÍ Òª¿çÏ̴߳«µÝÐèÒªÏÈ×¢²áÒ»ÏÂ
|
qRegisterMetaType<VideoPlayerState>();
|
|
connect(ui->pushButton_open, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
|
connect(ui->toolButton_open, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
|
connect(ui->pushButton_play, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
|
connect(ui->pushButton_pause,&QPushButton::clicked, this, &MainWindow::slotBtnClick);
|
connect(ui->pushButton_stop, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
|
connect(ui->pushButton_volume, &QPushButton::clicked, this, &MainWindow::slotBtnClick);
|
|
connect(ui->horizontalSlider, SIGNAL(sig_valueChanged(int)), this, SLOT(slotSliderMoved(int)));
|
connect(ui->horizontalSlider_volume, SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int)));
|
|
ui->page_video->setMouseTracking(true);
|
ui->widget_videoPlayer->setMouseTracking(true);
|
// ui->page_video->installEventFilter(this);
|
ui->widget_videoPlayer->installEventFilter(this);
|
ui->widget_container->installEventFilter(this);
|
|
//// int videoType = NORMALVIDEO;
|
// int videoType = RUNWEIVIDEO;
|
// initPlayer(static_cast<VIDEOTYPE>(videoType));
|
// mPlayer->setVideoPlayerCallBack(this);
|
// mVolume = mPlayer->getVolume();
|
|
mTimer = new QTimer; //¶¨Ê±Æ÷-»ñÈ¡µ±Ç°ÊÓÆµÊ±¼ä
|
connect(mTimer, &QTimer::timeout, this, &MainWindow::slotTimerTimeOut);
|
mTimer->setInterval(500);
|
|
mTimer_CheckControlWidget = new QTimer; //ÓÃÓÚ¿ØÖÆ¿ØÖƽçÃæµÄ³öÏÖºÍÒþ²Ø
|
connect(mTimer_CheckControlWidget, &QTimer::timeout, this, &MainWindow::slotTimerTimeOut);
|
mTimer_CheckControlWidget->setInterval(2500);
|
|
mAnimation_ControlWidget = new QPropertyAnimation(ui->widget_controller, "geometry");
|
|
ui->stackedWidget->setCurrentWidget(ui->page_open);
|
ui->pushButton_pause->hide();
|
|
resize(1280,720);
|
setTitle(QStringLiteral("±´Ë¼¿Æ×¨Òµ²¥·ÅÆ÷-V%1").arg(AppConfig::VERSION_NAME));
|
|
}
|
|
MainWindow::~MainWindow()
|
{
|
qDebug()<<__FUNCTION__;
|
|
AppConfig::saveConfigInfoToFile();
|
AppConfig::removeDirectory(AppConfig::AppDataPath_Tmp);
|
|
unInitPlayer();
|
delete ui;
|
}
|
|
void MainWindow::showOutControlWidget()
|
{
|
|
mAnimation_ControlWidget->setDuration(800);
|
|
int w = ui->widget_controller->width();
|
int h = ui->widget_controller->height();
|
int x = 0;
|
int y = ui->widget_container->height() - ui->widget_controller->height();
|
|
if (ui->widget_controller->isHidden())
|
{
|
ui->widget_controller->show();
|
mAnimation_ControlWidget->setStartValue(ui->widget_controller->geometry());
|
}
|
else
|
{
|
mAnimation_ControlWidget->setStartValue(ui->widget_controller->geometry());
|
}
|
|
// mAnimation_ControlWidget->setKeyValueAt(0, QRect(0, 0, 00, 00));
|
// mAnimation_ControlWidget->setKeyValueAt(0.4, QRect(20, 250, 20, 30));
|
// mAnimation_ControlWidget->setKeyValueAt(0.8, QRect(100, 250, 20, 30));
|
// mAnimation_ControlWidget->setKeyValueAt(1, QRect(250, 250, 100, 30));
|
mAnimation_ControlWidget->setEndValue(QRect(x, y, w, h));
|
mAnimation_ControlWidget->setEasingCurve(QEasingCurve::Linear); //ÉèÖö¯»Ð§¹û
|
|
mAnimation_ControlWidget->start();
|
|
}
|
|
void MainWindow::hideControlWidget()
|
{
|
mAnimation_ControlWidget->setTargetObject(ui->widget_controller);
|
|
mAnimation_ControlWidget->setDuration(300);
|
|
int w = ui->widget_controller->width();
|
int h = ui->widget_controller->height();
|
int x = 0;
|
int y = ui->widget_container->height() + h;
|
|
mAnimation_ControlWidget->setStartValue(ui->widget_controller->geometry());
|
mAnimation_ControlWidget->setEndValue(QRect(x, y, w, h));
|
mAnimation_ControlWidget->setEasingCurve(QEasingCurve::Linear); //ÉèÖö¯»Ð§¹û
|
|
mAnimation_ControlWidget->start();
|
}
|
|
|
void MainWindow::slotSliderMoved(int value)
|
{
|
if (QObject::sender() == ui->horizontalSlider)
|
{
|
if (mPlayer != nullptr) {
|
mPlayer->seek((qint64)value * 1000000);
|
}
|
}
|
else if (QObject::sender() == ui->horizontalSlider_volume)
|
{
|
if (mPlayer != nullptr) {
|
mPlayer->setVolume(value / 100.0);
|
ui->label_volume->setText(QString("%1").arg(value));
|
}
|
}
|
}
|
|
void MainWindow::slotTimerTimeOut()
|
{
|
if (QObject::sender() == mTimer)
|
{
|
int Sec = 0;
|
if (mPlayer != nullptr) {
|
Sec = mPlayer->getCurrentTime();
|
}
|
ui->horizontalSlider->setValue(Sec);
|
|
QString curTime;
|
QString hStr = QString("0%1").arg(Sec / 3600);
|
QString mStr = QString("0%1").arg(Sec / 60 % 60);
|
QString sStr = QString("0%1").arg(Sec % 60);
|
if (hStr == "00")
|
{
|
curTime = QString("%1:%2").arg(mStr.right(2)).arg(sStr.right(2));
|
}
|
else
|
{
|
curTime = QString("%1:%2:%3").arg(hStr).arg(mStr.right(2)).arg(sStr.right(2));
|
}
|
|
ui->label_currenttime->setText(curTime);
|
}
|
else if (QObject::sender() == mTimer_CheckControlWidget)
|
{
|
mTimer_CheckControlWidget->stop();
|
hideControlWidget();
|
}
|
}
|
|
void MainWindow::slotBtnClick(bool isChecked)
|
{
|
if (QObject::sender() == ui->pushButton_play)
|
{
|
if (mPlayer != nullptr) {
|
mPlayer->play();
|
}
|
}
|
else if (QObject::sender() == ui->pushButton_pause)
|
{
|
if (mPlayer != nullptr) {
|
mPlayer->pause();
|
}
|
}
|
else if (QObject::sender() == ui->pushButton_stop)
|
{
|
if (mPlayer != nullptr) {
|
mPlayer->stop(true);
|
}
|
}
|
else if (QObject::sender() == ui->pushButton_open || QObject::sender() == ui->toolButton_open)
|
{
|
SetVideoUrlDialog dialog;
|
|
dialog.setVideoUrl(AppConfig::gVideoFilePath);
|
dialog.setType(AppConfig::gVideoType);
|
|
if (dialog.exec() == QDialog::Accepted)
|
{
|
QString s = dialog.getVideoUrl();
|
int sType = dialog.getType();
|
|
if (!s.isEmpty())
|
{
|
AppConfig::gVideoFilePath = s;
|
AppConfig::gVideoType = sType;
|
AppConfig::saveConfigInfoToFile();
|
if (mPlayer != nullptr) {
|
mPlayer->stop(true); //Èç¹ûÔÚ²¥·ÅÔòÏÈÍ£Ö¹
|
}
|
|
int videoType = NORMALVIDEO;
|
qDebug() << "sType:" << sType;
|
if ((sType >= 0) && (sType < dialog.getItemCount())) {
|
videoType = sType;
|
}
|
initPlayer(static_cast<VIDEOTYPE>(videoType));
|
mPlayer->setVideoPlayerCallBack(this);
|
std::string name = QTextCodec::codecForName("GBK")->fromUnicode(s).data();
|
// std::string name = s.toUtf8().toStdString();
|
mPlayer->startPlay(name, videoType);
|
}
|
}
|
|
}
|
else if (QObject::sender() == ui->pushButton_volume)
|
{
|
qDebug()<<isChecked;
|
|
bool isMute = isChecked;
|
if (mPlayer != nullptr) {
|
mPlayer->setMute(isMute);
|
}
|
|
if (isMute)
|
{
|
if (mPlayer != nullptr) {
|
mVolume = mPlayer->getVolume();
|
}
|
|
ui->horizontalSlider_volume->setValue(0);
|
ui->horizontalSlider_volume->setEnabled(false);
|
ui->label_volume->setText(QString("%1").arg(0));
|
}
|
else
|
{
|
int volume = mVolume * 100.0;
|
ui->horizontalSlider_volume->setValue(volume);
|
ui->horizontalSlider_volume->setEnabled(true);
|
ui->label_volume->setText(QString("%1").arg(volume));
|
}
|
|
}
|
|
}
|
|
///´ò¿ªÎļþʧ°Ü
|
void MainWindow::onOpenVideoFileFailed(const int &code)
|
{
|
FunctionTransfer::runInMainThread([=]()
|
{
|
QMessageBox::critical(NULL, "tips", QString("open file failed %1").arg(code));
|
});
|
}
|
|
///´ò¿ªSDLʧ°ÜµÄʱºò»Øµ÷´Ëº¯Êý
|
void MainWindow::onOpenSdlFailed(const int &code)
|
{
|
FunctionTransfer::runInMainThread([=]()
|
{
|
QMessageBox::critical(NULL, "tips", QString("open Sdl failed %1").arg(code));
|
});
|
}
|
|
///»ñÈ¡µ½ÊÓÆµÊ±³¤µÄʱºòµ÷Óô˺¯Êý
|
void MainWindow::onTotalTimeChanged(const int64_t &uSec)
|
{
|
FunctionTransfer::runInMainThread([=]()
|
{
|
qint64 Sec = uSec/1000000;
|
|
ui->horizontalSlider->setRange(0,Sec);
|
|
QString totalTime;
|
QString hStr = QString("0%1").arg(Sec/3600);
|
QString mStr = QString("0%1").arg(Sec / 60 % 60);
|
QString sStr = QString("0%1").arg(Sec % 60);
|
if (hStr == "00")
|
{
|
totalTime = QString("%1:%2").arg(mStr.right(2)).arg(sStr.right(2));
|
}
|
else
|
{
|
totalTime = QString("%1:%2:%3").arg(hStr).arg(mStr.right(2)).arg(sStr.right(2));
|
}
|
|
ui->label_totaltime->setText(totalTime);
|
|
});
|
}
|
|
///²¥·ÅÆ÷״̬¸Ä±äµÄʱºò»Øµ÷´Ëº¯Êý
|
void MainWindow::onPlayerStateChanged(const VideoPlayerState &state, const bool &hasVideo, const bool &hasAudio)
|
{
|
FunctionTransfer::runInMainThread([=]()
|
{
|
if (state == VideoPlayer_Stop)
|
{
|
ui->stackedWidget->setCurrentWidget(ui->page_open);
|
|
ui->pushButton_pause->hide();
|
ui->widget_videoPlayer->clear();
|
|
ui->horizontalSlider->setValue(0);
|
ui->label_currenttime->setText("00:00");
|
ui->label_totaltime->setText("00:00");
|
|
mTimer->stop();
|
}
|
else if (state == VideoPlayer_Playing)
|
{
|
if (hasVideo)
|
{
|
ui->stackedWidget->setCurrentWidget(ui->page_video);
|
}
|
else
|
{
|
ui->stackedWidget->setCurrentWidget(ui->page_audio);
|
}
|
|
ui->pushButton_play->hide();
|
ui->pushButton_pause->show();
|
|
mTimer->start();
|
}
|
else if (state == VideoPlayer_Pause)
|
{
|
ui->pushButton_pause->hide();
|
ui->pushButton_play->show();
|
}
|
});
|
}
|
|
///ÏÔʾÊÓÆµÊý¾Ý£¬´Ëº¯Êý²»ÒË×öºÄʱ²Ù×÷£¬·ñÔò»áÓ°Ïì²¥·ÅµÄÁ÷³©ÐÔ¡£
|
void MainWindow::onDisplayVideo(std::shared_ptr<VideoFrame> videoFrame)
|
{
|
ui->widget_videoPlayer->inputOneFrame(videoFrame);
|
}
|
|
//ͼƬÏÔʾ²¿¼þʱ¼ä¹ýÂËÆ÷´¦Àí
|
bool MainWindow::eventFilter(QObject *target, QEvent *event)
|
{
|
if(target == ui->widget_container)
|
{
|
if(event->type() == QEvent::Resize)
|
{
|
///Í£Ö¹¶¯»£¬·ÀÖ¹´Ëʱ¸ÕºÃ¿ªÊ¼¶¯»£¬µ¼ÖÂλÖóö´í
|
mAnimation_ControlWidget->stop();
|
|
QResizeEvent * e = (QResizeEvent*)event;
|
int w = e->size().width();
|
int h = e->size().height();
|
ui->stackedWidget->move(0, 0);
|
ui->stackedWidget->resize(w, h);
|
|
int x = 0;
|
int y = h - ui->widget_controller->height();
|
ui->widget_controller->move(x, y);
|
ui->widget_controller->resize(w, ui->widget_controller->height());
|
}
|
}
|
else if(target == ui->page_video || target == ui->widget_videoPlayer)
|
{
|
if(event->type() == QEvent::MouseMove || event->type() == QEvent::MouseButtonPress)
|
{
|
if (!mTimer_CheckControlWidget->isActive())
|
{
|
showOutControlWidget();
|
}
|
|
mTimer_CheckControlWidget->stop();
|
mTimer_CheckControlWidget->start();
|
}
|
else if(event->type() == QEvent::Enter)
|
{
|
showOutControlWidget();
|
}
|
else if(event->type() == QEvent::Leave)
|
{
|
mTimer_CheckControlWidget->stop();
|
mTimer_CheckControlWidget->start();
|
}
|
}
|
|
//ÆäËü²¿¼þ²úÉúµÄʼþÔò½»¸ø»ùÀà´¦Àí
|
return DragAbleWidget::eventFilter(target, event);
|
}
|