基於Mplayer的QT視頻播放器

開發環境:linux QT4.8.2 QTcreator

所有程序截圖:

界面設計:


源碼獻上:mplayer.pro

#-------------------------------------------------
#
# Project created by QtCreator 2012-09-14T14:12:00
#
#-------------------------------------------------

QT       += core gui

TARGET = mplayer
TEMPLATE = app


SOURCES += main.cpp\
        movieform.cpp

HEADERS  += movieform.h

FORMS    += movieform.ui

RESOURCES +=


movieForm.h

#ifndef MOVIEFORM_H
#include <QProcess>
#include <QtGui>
namespace Ui {
class movieForm;
}

class movieForm : public QWidget
{
    Q_OBJECT
    
public:
    explicit movieForm(QWidget *parent = 0);
    ~movieForm();
    void play(QString fileName);
    
private slots:
    void on_nextBtn_clicked();

    void on_preBtn_clicked();

    void on_addBtn_clicked();

    void on_delBtn_clicked();

    void on_playBtn_clicked();

    void on_stopBtn_clicked();

    void on_timeBtn_clicked();

    void on_speedBtn_clicked();

    void on_list_itemDoubleClicked(QListWidgetItem *item);

    void on_currentlBar_sliderMoved(int value);

    void on_volumeSlider_sliderMoved(int v);
    void dataRecieve();
    void sureBtnClicked();

protected:
    void closeEvent(QCloseEvent *);

private:
        Ui::movieForm *ui;
        QSpinBox *minBox;
        QSpinBox *secBox;
        QString currentPercent;
        QProcess *p;
        QString currentStr;
        QString totalTime;

};

#endif // MOVIEFORM_H

main.cpp

#include <QtGui/QApplication>
#include "movieform.h"
#include<QTextCodec>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
        QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
        movieForm w;
        w.show();
        return a.exec();

}


movieForm.cpp

#include "movieform.h"
#include "ui_movieform.h"
#include <QtGui>
movieForm::movieForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::movieForm)
{
    ui->setupUi(this);
    setWindowTitle("視頻播放器");
    p=new QProcess(this);
    connect(p,SIGNAL(readyReadStandardOutput()),this,SLOT(dataRecieve()));

}

movieForm::~movieForm()
{
    delete ui;
}

void movieForm::on_nextBtn_clicked()
{
    if(ui->list->currentRow()==ui->list->count()-1)
      ui->list->setCurrentRow(0);
    else
      ui->list->setCurrentRow(ui->list->currentRow()+1);
      play(ui->list->currentItem()->text());
      ui->playBtn->setText("暫停");
}

void movieForm::on_preBtn_clicked()
{
    if(ui->list->currentRow()==0)
      ui->list->setCurrentRow(ui->list->count()-1);
    else
      ui->list->setCurrentRow(ui->list->currentRow()-1);
      play(ui->list->currentItem()->text());
      ui->playBtn->setText("暫停");
}

void movieForm::on_addBtn_clicked()
{
    QStringList fileNames=QFileDialog::getOpenFileNames(this,"choose movies","/","Movie (*.m4v *.mp4 *.avi *.wmv *.mpg)");
     if(fileNames.count()!=0)
      ui->list->addItems(fileNames);
}

void movieForm::on_delBtn_clicked()
{
    if(ui->list->currentRow()==-1)
       QMessageBox::warning(this,"提示","未選中項目或列表爲空",QMessageBox::Yes);
    else
     ui->list->takeItem(ui->list->currentRow());
}

void movieForm::on_list_itemDoubleClicked(QListWidgetItem *item)
{
    play(item->text());
    ui->playBtn->setText("暫停");
}
void movieForm::play(QString fileName)
{
   QStringList args;
p->kill();
//p=new QProcess(this);
 //connect(p,SIGNAL(readyReadStandardOutput()),this,SLOT(dataRecieve()));
args<<"-slave";
args<<"-quiet";
args<<"-wid"<<QString::number(ui->view->winId(),10);
args<<"-zoom";
args<<"-x";
args<<"370";
args<<"-y";
args<<"335";
args<<"-vo";
args<<"x11";
args<<fileName;
p->start("mplayer",args);
ui->playBtn->setEnabled(true);
ui->stopBtn->setEnabled(true);
}
void movieForm::on_playBtn_clicked()
{

    p->write("pause\n");
    if(ui->playBtn->text()=="播放")
    {

     connect(p,SIGNAL(readyReadStandardOutput()),this,SLOT(dataRecieve()));
     p->write("get_time_length\n");
     p->write("get_time_pos\n");
     p->write("get_percent_pos\n");
      ui->playBtn->setText("暫停");
    }
    else
    {
     disconnect(p,SIGNAL(readyReadStandardOutput()),this,SLOT(dataRecieve()));
      ui->playBtn->setText("播放");
    }
}

void movieForm::on_stopBtn_clicked()
{
    p->write("quit\n");
   ui->timeLabel->clear();
   ui->percentLabel->clear();
}
void movieForm::on_volumeSlider_sliderMoved(int v)
{
  p->write(QString("volume "+QString::number(v)+" 2\n").toUtf8());
}
void movieForm::on_speedBtn_clicked()
{
    double speed=QInputDialog::getDouble(this,"播放速度設置","相對於正常速度倍數:");
    if(speed>0)
    p->write(QString("speed_set "+QString::number(speed)+" 2\n").toUtf8());
}

void movieForm::closeEvent(QCloseEvent *)
{
 p->kill();
}
void movieForm::dataRecieve()
{
 p->write("get_time_length\n");
 p->write("get_time_pos\n");
 p->write("get_percent_pos\n");
   while(p->canReadLine())
{
   QByteArray b=p->readLine();
   if(b.startsWith("ANS_TIME_POSITION"))
   {
   b.replace(QByteArray("\n"),QByteArray(""));
   QString s(b);
   currentStr=s.mid(18);
  ui->currentlBar->setValue(s.mid(18).toFloat());    //更新進度條
   }
   else if((b.startsWith("ANS_LENGTH")))
   {
       b.replace(QByteArray("\n"),QByteArray(""));
    QString s(b);
     totalTime=s.mid(11);
    ui->timeLabel->setText(currentStr+"秒/"+totalTime+"秒  "); //顯示時間進度
 ui->currentlBar->setRange(0,s.mid(11).toFloat());
   }
    else if((b.startsWith("ANS_PERCENT_POSITION")))
    {
 b.replace(QByteArray("\n"),QByteArray(""));
     QString s(b);
     currentPercent=s.mid(21);
    ui->percentLabel->setText("("+currentPercent+"%)");
    }
}

}
void movieForm::on_currentlBar_sliderMoved(int value)
{
    p->write(QString("seek "+QString::number(value)+" 2\n").toUtf8());

}

void movieForm::on_timeBtn_clicked()
{
    QDialog *timeDialog=new QDialog(this);
     timeDialog->resize(300,100);
     minBox=new QSpinBox(timeDialog);
   minBox->setGeometry(QRect(20,20,50,30));
     QLabel *minLabel=new QLabel("分",timeDialog);
   minLabel->setGeometry(QRect(80,20,20,30));

     secBox=new QSpinBox(timeDialog);
   secBox->setGeometry(QRect(100,20,50,30));
     QLabel *secLabel=new QLabel("秒",timeDialog);
   secLabel->setGeometry(QRect(150,20,30,30));

   QPushButton *sureBtn=new QPushButton("確定",timeDialog);
   sureBtn->setGeometry(QRect(180,20,70,30));
   connect(sureBtn,SIGNAL(clicked()),this,SLOT(sureBtnClicked()));
   timeDialog->show();
}
void movieForm::sureBtnClicked()
{
  int jumpTime=minBox->value()*60+secBox->value();
  p->write(QString("seek "+QString::number(jumpTime)+" 2\n").toUtf8());
}











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章