QT 基于mplayer媒体播放器

    技术2024-08-15  86

     

     

    播放器全屏 音量 时间进度都已经实现,追加快捷键设计...

    MAINWINDOW.H

     

    #ifndef MAINWINDOW_H

    #define MAINWINDOW_H #include <QMainWindow> #include <QProcess> #include <QSlider> #include <QFileDialog> #include <QDockWidget> #include <QMenu> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QProcess *mplayerProcess; QString filename; QTimer *poller; QWidget *w; QDockWidget *shapesDockWidget1; QDockWidget *shapesDockWidget2; QTimer *interval; QAction *at2; QAction *at3; QAction *at4; QAction *at5; QMenu *menu; QPoint m_dragPosition; private slots: void on_textEdit_3_textChanged(); void on_spinBox_editingFinished(); void on_spinBox_valueChanged(int ); void writeSettings(); void readSettings(); void on_pushButton_10_clicked(); void on_pushButton_9_clicked(); void on_pushButton_6_clicked(); void on_pushButton_5_clicked(); void on_pushButton_3_clicked(); void on_pushButton_2_clicked(); void on_horizontalSlider_2_valueChanged(int value); void on_pushButton_8_clicked(); void on_pushButton_clicked(); void on_pushButton_7_clicked(); void on_pushButton_4_clicked(); void timeLineChanged(int pos); void pollCurrentTime(); void reject(); void enterFullScreen(); void enter(); void closeEvent(QCloseEvent *ex); void contextMenuEvent(QContextMenuEvent * event); void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); bool eventFilter(QObject *obj, QEvent *ev); }; #endif // MAINWINDOW_H    MAINWINDOW.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "QProcess" #include <QDockWidget> #include <QFileDialog> #include <QVBoxLayout> #include <QSlider> #include <QTime> #include <QTimer> #include <QDebug> #include <QPalette> #include <QMessageBox> #include <QDesktopWidget> #include <QApplication> #include <QDir> #include <QSettings> #include <QCloseEvent> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); mplayerProcess = new QProcess(this); shapesDockWidget1 = new QDockWidget(QString::fromLocal8Bit("播放界面")); shapesDockWidget1->setWidget(ui->widget_4); shapesDockWidget2 = new QDockWidget(QString::fromLocal8Bit("播放时间")); shapesDockWidget2->setWidget(ui->widget_2); // QWidget *wi = new QWidget(this); // wi->resize(400,300); addDockWidget(Qt::BottomDockWidgetArea, shapesDockWidget1); addDockWidget(Qt::BottomDockWidgetArea, shapesDockWidget2); shapesDockWidget2->show(); QVBoxLayout *vLayout = new QVBoxLayout(this); vLayout->addWidget(ui->widget); w=new QWidget(this); w->setLayout(vLayout); this->setCentralWidget(w); poller = new QTimer(this); interval= new QTimer(this); connect(interval,SIGNAL(timeout()),this,SLOT(reject()) ); interval->start(1000); connect(ui->horizontalSlider, SIGNAL(sliderMoved(int)), this, SLOT(timeLineChanged(int))); connect(mplayerProcess, SIGNAL(readyReadStandardOutput()),this, SLOT(reject())); connect(poller, SIGNAL(timeout()), this, SLOT(pollCurrentTime())); //setWindowOpacity(0.95); QPalette plt = palette(); //plt.setColor(QPalette::Background, QColor("Black")); plt.setColor(QPalette::Background, QColor("Grey")); this->setPalette(plt); ui->label_4->setText(QString::fromLocal8Bit("不是全屏")); w->setAutoFillBackground(true); QAction *at1 = new QAction("进入全屏", this); this->addAction(at1); this->setAcceptDrops(true); at1->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_F)<< QKeySequence(Qt::Key_MediaStop)); //connect(at1, SIGNAL(triggered()), this,SLOT(enterFullScreen())); at2 = new QAction(QString::fromLocal8Bit("暂停/开始"), this); this->addAction(at2); this->setAcceptDrops(true); at2->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Space)<< QKeySequence(Qt::Key_MediaStop)); connect(at2, SIGNAL(triggered()), this,SLOT(enter())); at3 = new QAction(QString::fromLocal8Bit("全屏"), this); this->addAction(at3); this->setAcceptDrops(true); at3->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_D)<< QKeySequence(Qt::Key_MediaStop)); connect(at3, SIGNAL(triggered()), ui->pushButton_5,SLOT(click())); at4 = new QAction(QString::fromLocal8Bit("退出全屏"), this); this->addAction(at4); this->setAcceptDrops(true); at4->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_S)<< QKeySequence(Qt::Key_MediaStop)); connect(at4, SIGNAL(triggered()), ui->pushButton_6,SLOT(click())); at5 = new QAction(QString::fromLocal8Bit("打开"), this); this->addAction(at5); this->setAcceptDrops(true); at5->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_A)<< QKeySequence(Qt::Key_MediaStop)); connect(at5, SIGNAL(triggered()), ui->pushButton_4,SLOT(click())); QAction *at6 = new QAction("前进", this); this->addAction(at6); this->setAcceptDrops(true); at6->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Right)<< QKeySequence(Qt::Key_MediaStop)); connect(at6, SIGNAL(triggered()), ui->pushButton_9,SLOT(click())); QAction *at7 = new QAction("后退", this); this->addAction(at7); this->setAcceptDrops(true); at7->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Left)<< QKeySequence(Qt::Key_MediaStop)); connect(at7, SIGNAL(triggered()), ui->pushButton_10,SLOT(click())); QAction *at8 = new QAction("提高音量", this); this->addAction(at8); this->setAcceptDrops(true); at8->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Up)<< QKeySequence(Qt::Key_MediaStop)); connect(at8, SIGNAL(triggered()), ui->pushButton_2,SLOT(click())); QAction *at9 = new QAction("降低", this); this->addAction(at9); this->setAcceptDrops(true); at9->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Down)<< QKeySequence(Qt::Key_MediaStop)); connect(at9, SIGNAL(triggered()), ui->pushButton_3,SLOT(click())); this->readSettings(); w->installEventFilter(this); int x=(QApplication::desktop()->width() - this->width())/2; int y=(QApplication::desktop()->height() - this->height())/2; this->move (x,y); this->resize(800,600); // QDesktopWidget* desktop = QApplication::desktop(); // int width = desktop->width(); // int height = desktop->height(); } void MainWindow::enterFullScreen() { mplayerProcess->write("vo_fullscreen /n"); } void MainWindow::enter() { if(ui->label_6->text()==QString::fromLocal8Bit("开始")) { mplayerProcess->write("pause/n"); poller->stop(); ui->label_6->setText(QString::fromLocal8Bit("暂停")); } else if(ui->label_6->text()==QString::fromLocal8Bit("暂停")) { mplayerProcess->write("pause/n"); mplayerProcess->write("get_time_length/n"); poller->start(10); ui->label_6->setText(QString::fromLocal8Bit("开始")); } } MainWindow::~MainWindow() { delete ui; } void MainWindow::pollCurrentTime() { mplayerProcess->write("get_time_pos/n"); // qDebug()<<ui->label->text(); //log->append(QString(buffer)); ui->textEdit->setText(QString::number(ui->horizontalSlider->maximum()/3600)+":"+QString::number((ui->horizontalSlider->maximum()/60)%60)+":"+QString::number(ui->horizontalSlider->maximum()%60)); ui->textEdit_2->setText(QString::number(ui->horizontalSlider->value()/3600)+":"+QString::number((ui->horizontalSlider->value()/60)%60)+":"+QString::number(ui->horizontalSlider->value()%60)); } void MainWindow::reject() { this->setFocus(); // ui->label_5->setText(QString::number(ui->horizontalSlider->maximum()/3600)+":"+QString::number((ui->horizontalSlider->maximum()/60)%60)+":"+QString::number(ui->horizontalSlider->maximum()%60)); //ui->label_5->setText(QString::number(ui->horizontalSlider->value()/3600)+":"+QString::number((ui->horizontalSlider->value()/60)%60)+":"+QString::number(ui->horizontalSlider->value()%60)); while(mplayerProcess->canReadLine()) { QByteArray buffer(mplayerProcess->readLine()); ui->textEdit_3->append(QString(buffer)); //qDebug()<<buffer; //log->append(QString(buffer)); // On vérifie si on a eu des réponses // réponse à get_video_resolution : ANS_VIDEO_RESOLUTION='<width> x <height>' if(buffer.startsWith("ANS_VIDEO_RESOLUTION")) { buffer.remove(0, 21); // vire ANS_VIDEO_RESOLUTION= buffer.replace(QByteArray("'"), QByteArray("")); buffer.replace(QByteArray(" "), QByteArray("")); buffer.replace(QByteArray("/n"), QByteArray("")); buffer.replace(QByteArray("/r"), QByteArray("")); int sepIndex = buffer.indexOf('x'); int resX = buffer.left(sepIndex).toInt(); int resY = buffer.mid(sepIndex+1).toInt(); ui->widget->setMinimumSize(resX, resY); } // réponse à get_time_length : ANS_LENGTH=xx.yy else if(buffer.startsWith("ANS_LENGTH")) { buffer.remove(0, 11); // vire ANS_LENGTH= buffer.replace(QByteArray("'"), QByteArray("")); buffer.replace(QByteArray(" "), QByteArray("")); buffer.replace(QByteArray("/n"), QByteArray("")); buffer.replace(QByteArray("/r"), QByteArray("")); float maxTime = buffer.toFloat(); ui->horizontalSlider->setMaximum(static_cast<int>(maxTime+1)); } // réponse à get_time_pos : ANS_TIME_POSITION=xx.y else if(buffer.startsWith("ANS_TIME_POSITION")) { buffer.remove(0, 18); // vire ANS_TIME_POSITION= buffer.replace(QByteArray("'"), QByteArray("")); buffer.replace(QByteArray(" "), QByteArray("")); buffer.replace(QByteArray("/n"), QByteArray("")); buffer.replace(QByteArray("/r"), QByteArray("")); float currTime = buffer.toFloat(); ui->horizontalSlider->setValue(static_cast<int>(currTime+1)); } } } void MainWindow::timeLineChanged(int pos) { mplayerProcess->write(QString("seek " + QString::number(pos) + " 2/n").toUtf8()); } void MainWindow::on_pushButton_4_clicked() { filename=QFileDialog::getOpenFileName(this,QString::fromLocal8Bit("文件类型"),".",QString::fromLocal8Bit("文问类型(*.*)")); if (filename!=NULL) { poller->stop(); mplayerProcess->close(); this->setWindowTitle(filename); ui->pushButton_7->setEnabled(true); mplayerProcess = new QProcess(this); QString exefile = QCoreApplication::applicationDirPath()+"/mplayer/mplayer.exe "; qDebug()<<exefile; //qDebug()<<QCoreApplication::applicationDirPath(); QStringList args; args << "-slave"; // Et on veut ne pas avoir trop de chose parser :) args << "-zoom"; //args << "-quiet"; //args << "-xy 1024"; //args << "-wid" << QString::number(reinterpret_cast<qlonglong>(w->winId()))<<"-x"<<"1680"<<"-y"<<"1050" ; args << "-wid" << QString::number(reinterpret_cast<qlonglong>(w->winId())) ; args <<"-vo" << "direct3d"; //args <<"-vo" << "gl"; //vo=gl //direct3d //mplayer -fs -zoom -vo fbdev -xy 1024 filename args << filename; mplayerProcess->setProcessChannelMode(QProcess::MergedChannels); mplayerProcess->start(exefile,args); if(!mplayerProcess->waitForStarted(3000)) { qDebug("allez, cherche le bug :o"); } // On récupère les infos de base mplayerProcess->write("get_video_resolution/n"); mplayerProcess->write("get_time_length/n"); mplayerProcess->write("get_time_length/n"); //mplayerProcess->write("get_time_pos/n"); poller->start(10); //mplayerProcess->write("pause/n"); ui->label_6->text()=="开始"; } } void MainWindow::on_pushButton_7_clicked() { if(ui->label_6->text()==QString::fromLocal8Bit("开始")) { mplayerProcess->write("pause/n"); poller->stop(); ui->label_6->setText(QString::fromLocal8Bit("暂停")); } else if(ui->label_6->text()==QString::fromLocal8Bit("暂停")) { mplayerProcess->write("pause/n"); mplayerProcess->write("get_time_length/n"); poller->start(10); ui->label_6->setText(QString::fromLocal8Bit("开始")); } } void MainWindow::on_pushButton_clicked() { mplayerProcess->write("vo_fullscreen/n"); } void MainWindow::on_pushButton_8_clicked() { QMessageBox::information(this, QString::fromLocal8Bit("About Mdiea Player"), QString::fromLocal8Bit("快捷键说明: /n打开:A /n暂停/开始:space /n全屏:D /n取消全屏:S /n快进:right /n后退:left /n音量提高:top /n音量降低:down /nID:Jammy 基于mplayer开发 版本0.06")); } void MainWindow::on_horizontalSlider_2_valueChanged(int value) { int i; QString str; QByteArray str1; mplayerProcess->write("volume "+str1+"/n"); i=-(40- value); str=QString::number(i); str1=str.toAscii(); mplayerProcess->write("volume "+str1+"/n"); //qDebug()<<i<<value; } void MainWindow::on_pushButton_2_clicked() { mplayerProcess->write("volume +1/n"); } void MainWindow::on_pushButton_3_clicked() { mplayerProcess->write("volume -1/n"); } void MainWindow::on_pushButton_5_clicked() { this->setWindowFlags(Qt::Window ); w->setWindowFlags(Qt::FramelessWindowHint); this->showFullScreen(); shapesDockWidget1->hide(); shapesDockWidget2->hide(); ui->label_4->setText(QString::fromLocal8Bit("全屏")); } void MainWindow::on_pushButton_6_clicked() { this->setWindowFlags(Qt::Window); this->resize(800,600); // w->setWindowFlags(Qt::FramelessWindowHint); this->showNormal(); shapesDockWidget1->show(); shapesDockWidget2->show(); int x=(QApplication::desktop()->width() - this->width())/2; int y=(QApplication::desktop()->height() - this->height())/2; this->move (x,y); ui->label_4->setText(QString::fromLocal8Bit("不是全屏")); } void MainWindow::on_pushButton_9_clicked() { QString str; str= QString::number(ui->spinBox->value()); mplayerProcess->write("seek +"+str.toAscii()+"/n"); qDebug()<<str; qDebug()<<"seek +"+str.toAscii()+"/n"; } void MainWindow::on_pushButton_10_clicked() { QString str; str= QString::number(ui->spinBox->value()); mplayerProcess->write("seek -"+str.toAscii()+"/n"); } void MainWindow::on_spinBox_valueChanged(int ) { w->setFocus(); } void MainWindow::on_spinBox_editingFinished() { w->setFocus(); } void MainWindow::closeEvent(QCloseEvent *ex) { // int a= QMessageBox::information(NULL,QString::fromLocal8Bit("对话框"),QString::fromLocal8Bit("是否需要退出"),QString::fromLocal8Bit("确定"),QString::fromLocal8Bit("取消"),NULL,0,-1); // if(a==0) // { writeSettings(); // ex->accept(); // } // else if(a==1) // { // ex->ignore(); // } } void MainWindow::writeSettings() { QSettings settings("Software", "Icon Editor"); settings.beginGroup("mainWindow"); settings.setValue("size", size()); settings.setValue("state", saveState()); settings.endGroup(); } void MainWindow::readSettings() { QSettings settings("Software", "Icon Editor"); settings.beginGroup("mainWindow"); resize(settings.value("size").toSize()); restoreState(settings.value("state").toByteArray()); settings.endGroup(); } void MainWindow::contextMenuEvent(QContextMenuEvent *event) { shapesDockWidget1->show(); shapesDockWidget2->show(); // QCursor cur=this->cursor(); menu=new QMenu(this); menu->addAction(at5); menu->addAction(at2); menu->addAction(at3); menu->addAction(at4); //menu->exec(cur.pos()); menu->exec(event->globalPos());// //this->setContextMenuPolicy(Qt::ActionsContextMenu); } void MainWindow::mouseMoveEvent(QMouseEvent *event) { // if(ui->label_4->text()==QString::fromLocal8Bit("不是全屏")) // { // if (event->buttons() & Qt::LeftButton ) { // move(event->globalPos() - m_dragPosition); move(event->globalPos() - m_dragPosition); // event->accept(); // } //} } void MainWindow::mousePressEvent(QMouseEvent *event) { // if(ui->label_4->text()==QString::fromLocal8Bit("不是全屏")) // { // if (event->button() == Qt::LeftButton) { // m_dragPosition = event->globalPos() - frameGeometry().topLeft(); // ui->widget->move(m_dragPosition); // event->accept(); //} // } } bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if (obj == w) { if (event->type() == QEvent::MouseButtonDblClick) { QMouseEvent *ev = static_cast<QMouseEvent *>(event); if (ev->buttons() & Qt::LeftButton) { if(ui->label_4->text()==QString::fromLocal8Bit("不是全屏")) { this->setWindowFlags(Qt::Window ); w->setWindowFlags(Qt::FramelessWindowHint); this->showFullScreen(); shapesDockWidget1->hide(); shapesDockWidget2->hide(); ui->label_4->setText(QString::fromLocal8Bit("全屏")); } else if(ui->label_4->text()==QString::fromLocal8Bit("全屏")) { this->setWindowFlags(Qt::Window); this->resize(800,600); // w->setWindowFlags(Qt::FramelessWindowHint); this->showNormal(); shapesDockWidget1->show(); shapesDockWidget2->show(); int x=(QApplication::desktop()->width() - this->width())/2; int y=(QApplication::desktop()->height() - this->height())/2; this->move (x,y); ui->label_4->setText(QString::fromLocal8Bit("不是全屏")); } // m_dragPosition = ev->globalPos() - frameGeometry().topLeft(); // ev->accept(); } return true; } else if (event->type() == QEvent::MouseButtonPress) { QMouseEvent *ev = static_cast<QMouseEvent *>(event); if (ev->buttons() & Qt::LeftButton) { if(ui->label_4->text()==QString::fromLocal8Bit("全屏")) { shapesDockWidget1->hide(); shapesDockWidget2->hide(); } else if(ui->label_4->text()==QString::fromLocal8Bit("不是全屏")) { m_dragPosition = ev->globalPos() - frameGeometry().topLeft(); ev->accept(); w->setFocus(); } // m_dragPosition = ev->globalPos() - frameGeometry().topLeft(); // ev->accept(); } return true; } else if (event->type() == QEvent::MouseMove){ QMouseEvent *ev = static_cast<QMouseEvent *>(event); if (ev->buttons() & Qt::LeftButton ) { if(ui->label_4->text()==QString::fromLocal8Bit("不是全屏")) { // move(event->globalPos() - m_dragPosition); move(ev->globalPos() - m_dragPosition); ev->accept(); w->setFocus(); } } } else { return false; } } else { // pass the event on to the parent class return QMainWindow::eventFilter(obj, event); } return true; } void MainWindow::on_textEdit_3_textChanged() { w->setFocus(); }     ************************************************** main.cpp   #include <QtGui/QApplication>#include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
    最新回复(0)