/** * Ò¶º£»Ô * QQȺ121376426 * http://blog.yundiantech.com/ */ #include "MainWindow.h" #include "ui_MainWindow.h" #include #include #include #include #include #include #include #include #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(); 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)); // 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("basic-player-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)); 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()<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) { 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); }