您的位置:首页 > 编程语言 > Qt开发

基于qt和mplayer的影音播放器

2015-08-11 17:38 716 查看

基于qt和mplayer的影音播放器

转自:http://www.cnblogs.com/ziqiuqiandao/archive/2012/11/24/2785473.html

这是一个基于qt和mplayer使用的影音播放器,代码不多,就3,4百行。

使用到的控件有QWidget、QLabel、QFrame、QPushButton、QSlider、QListWidget、QProcess和QString。

通过这几种控件的使用,可以基本了解到qt的编程风格和使用方式。

这个程序参考了网上流行的qt控制mplayer播放的多篇文章,在此感谢一下。

运行效果图如下:





qmplayer.pro:

######################################################################
# Automatically generated by qmake (2.01a) ?? ?? 18 03:06:00 2010
######################################################################

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += qmplayer.h
SOURCES += main.cpp qmplayer.cpp


main.cpp:

#include "qmplayer.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMPlayer *qmplayer = new QMPlayer;
qmplayer->showFullScreen();
return app.exec();
}

qmplayer.h:
   
#ifndef _H_QMPLAYER_
#define _H_QMPLAYER_

#include <QtGui>

class QMPlayer:public QWidget
{
Q_OBJECT
public:
void play(QString fileName);
QMPlayer(QWidget *parent = 0);

private slots:
void next();
void prev();
void pause();
void stop();
void setSpeed();
void dataRecieve();
void addItem();
void delItem();
void current(int);
void changeVolume(int);
void playListItem(QListWidgetItem *);

private:
QLabel *playLabel;
QLabel *timeLabel;
QLabel *percentLabel;
QLabel *voiceLabel;
QLabel *volumeLabel;

QFrame *ctlFrame;
QPushButton *playBtn;
QPushButton *stopBtn;
QPushButton *prevBtn;
QPushButton *nextBtn;
QPushButton *speedBtn;

QSlider *currentlBar;
QSlider *volumeSlider;

QListWidget *playList;
QPushButton *addBtn;
QPushButton *delBtn;

QProcess *p;
QString currentStr;
QString currentPercent;
QString totalTime;
QString fileName;
};

#endif /* _H_QMPLAYER_ */

qmplayer.cpp:

#include "qmplayer.h"

QMPlayer::QMPlayer(QWidget *parent) :QWidget(parent)
{
resize(320, 240);
setWindowTitle("mplayer");

playLabel = new QLabel(this);
playLabel->setGeometry(QRect(0, 0, 240, 180));
playLabel->setPixmap(QPixmap("images/mplayer.png"));

ctlFrame = new QFrame(this);
ctlFrame->setGeometry(QRect(15, 183, 300, 55));
ctlFrame->setFrameShape(QFrame::StyledPanel);
ctlFrame->setFrameShadow(QFrame::Raised);

currentlBar = new QSlider(ctlFrame);
currentlBar->setGeometry(QRect(10, 0, 180, 18));
currentlBar->setOrientation(Qt::Horizontal);
connect(currentlBar, SIGNAL(sliderMoved(int)), this, SLOT(current(int)));

percentLabel = new QLabel(ctlFrame);
percentLabel->setGeometry(QRect(195, 2, 40, 18));

timeLabel = new QLabel(ctlFrame);
timeLabel->setGeometry(QRect(235, 2, 60, 18));

stopBtn = new QPushButton("stop",ctlFrame);
stopBtn->setGeometry(QRect(10, 18, 40, 18));
stopBtn->setEnabled(false);
connect(stopBtn, SIGNAL(clicked()), this, SLOT(stop()));

prevBtn = new QPushButton("prev",ctlFrame);
prevBtn->setGeometry(QRect(60, 18, 40, 18));
connect(prevBtn, SIGNAL(clicked()), this, SLOT(prev()));

playBtn = new QPushButton("play",ctlFrame);
playBtn->setGeometry(QRect(110, 18, 55, 18));
playBtn->setEnabled(false);
connect(playBtn, SIGNAL(clicked()), this, SLOT(pause()));

nextBtn = new QPushButton("next", ctlFrame);
nextBtn->setGeometry(QRect(175, 18, 40, 18));
connect(nextBtn, SIGNAL(clicked()), this, SLOT(next()));

speedBtn = new QPushButton("speed", ctlFrame);
speedBtn->setGeometry(QRect(225, 18, 55, 18));
connect(speedBtn, SIGNAL(clicked()), this, SLOT(setSpeed()));

voiceLabel = new QLabel("voice:", ctlFrame);
voiceLabel->setGeometry(QRect(10, 36, 50, 18));

volumeSlider = new QSlider(ctlFrame);
volumeSlider->setGeometry(QRect(70, 36, 100, 18));
volumeSlider->setOrientation(Qt::Horizontal);
volumeSlider->setRange(0, 100);
volumeSlider->setValue(100);
volumeSlider->setEnabled(false);
connect(volumeSlider, SIGNAL(sliderMoved(int)), this, SLOT(changeVolume(int)));

volumeLabel = new QLabel(ctlFrame);
volumeLabel->setGeometry(QRect(175, 36, 60, 18));
volumeLabel->setText(QString::number(100));

playList = new QListWidget(this);
playList->setGeometry(QRect(243, 8, 73, 150));
connect(playList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(playListItem(QListWidgetItem *)));

addBtn = new QPushButton(QIcon("images/add.png"), "", this);
addBtn->setGeometry(QRect(248, 160, 30, 20));
addBtn->setStyleSheet("border-style:none");
connect(addBtn, SIGNAL(clicked()), this, SLOT(addItem()));

delBtn = new QPushButton(QIcon("images/remove.png"), "", this);
delBtn->setGeometry(QRect(283, 160, 30, 20));
delBtn->setStyleSheet("border-style:none");
connect(delBtn, SIGNAL(clicked()), this, SLOT(delItem()));

}

/*************************************************

Function:next

Description:play the next movie/song

*************************************************/
void QMPlayer::next()
{
if (playList->count() != 0) {
if(playList->currentRow() == playList->count() - 1)
playList->setCurrentRow(0);
else
playList->setCurrentRow(playList->currentRow() + 1);

play(playList->currentItem()->text());
playBtn->setText("pause");
}
}

/*************************************************

Function:prev

Description:play the previous movie/song

*************************************************/
void QMPlayer::prev()
{
if (playList->count() != 0) {
if(playList->currentRow() == 0)
playList->setCurrentRow(playList->count() - 1);
else
playList->setCurrentRow(playList->currentRow() - 1);

play(playList->currentItem()->text());
playBtn->setText("pause");
}
}

/*************************************************

Function:addItem

Description:add a item in the playlist

*************************************************/
void QMPlayer::addItem()
{
QStringList fileNames = QFileDialog::getOpenFileNames(this, "choose movie/song", "/", "Movie/Song (*.mp4 *.mp3)");
if(fileNames.count() != 0)
playList->addItems(fileNames);
}

/*************************************************

Function:delItem

Description:delete a item in the playlist

*************************************************/
void QMPlayer::delItem()
{
if(playList->currentRow() == -1)
QMessageBox::warning(this, "note", "not select or playList is null", QMessageBox::Yes);
else
playList->takeItem(playList->currentRow());
}

/*************************************************

Function:playListItem

Description:play a item in the playlist

*************************************************/
void QMPlayer::playListItem(QListWidgetItem *item)
{
play(item->text());
playBtn->setText("pause");
}

/*************************************************

Function:play

Description:call mplayer to play movie/song

*************************************************/

void QMPlayer::play(QString fileName)
{
if (p != NULL)
p->kill();

p = new QProcess(this);
connect(p, SIGNAL(readyReadStandardOutput()), this, SLOT(dataRecieve()));

QStringList args;
args << "-slave";
args << "-quiet";
args << "-zoom";
args << "-x";
args << "240";
args << "-y";
args << "180";
args << fileName;
p->start("mplayer", args);

playBtn->setEnabled(true);
stopBtn->setEnabled(true);
volumeSlider->setEnabled(true);

timeLabel->show();
percentLabel->show();
}

/*************************************************

Function:pause

Description:pause a playing movie/song

*************************************************/
void QMPlayer::pause()
{
p->write("pause\n");
if (playBtn->text() == "play") {
connect(p, SIGNAL(readyReadStandardOutput()), this, SLOT(dataRecieve()));
dataRecieve();
playBtn->setText("pause");
}
else {
disconnect(p, SIGNAL(readyReadStandardOutput()), this, SLOT(dataRecieve()));
playBtn->setText("play");
}

}

/*************************************************

Function:stop

Description:stop a playing movie/song

*************************************************/
void QMPlayer::stop()
{
p->kill();
p = NULL;
timeLabel->hide();
percentLabel->hide();
playLabel->update();

playBtn->setEnabled(false);
stopBtn->setEnabled(false);
volumeSlider->setEnabled(false);
}

/*************************************************

Function:changeVolume

Description:change the volume

*************************************************/
void QMPlayer::changeVolume(int v)
{
volumeLabel->setText(QString::number(v));
p->write(QString("volume " + QString::number(v) + " 2\n").toUtf8());
}

/*************************************************

Function:setSpeed

Description:set the playing speed

*************************************************/
void QMPlayer::setSpeed()
{
double speed=QInputDialog::getDouble(this, "set speed", "compare with nomal speed");
if(speed > 0)
p->write(QString("speed_set " + QString::number(speed) + " 2\n").toUtf8());
}

/*************************************************

Function:dataRecieve

Description:recieve the data from mplayer

*************************************************/
void QMPlayer::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();
b.replace(QByteArray("\n"), QByteArray(""));
QString s(b);

if (b.startsWith("ANS_TIME_POSITION")) {
currentStr = s.mid(18);
timeLabel->setText(currentStr + "s");
currentlBar->setValue(s.mid(18).toFloat());
}
else if (b.startsWith("ANS_LENGTH")) {
totalTime = s.mid(11);
currentlBar->setRange(0, s.mid(11).toFloat());
}
else if(b.startsWith("ANS_PERCENT_POSITION")) {
currentPercent = s.mid(21);
percentLabel->setText(currentPercent + "%");
}
}

}

/*************************************************

Function:current

Description:get the current process from mplayer

*************************************************/

void QMPlayer::current(int value)
{
p->write(QString("seek " + QString::number(value) + " 2\n").toUtf8());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Qt