熬了几个晚上终于用Phonon做了个简单的播放器了。以后慢慢优化,打算用上线程,网络编程,希望还能用上QML。 //mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QtGui/QMainWindow> #include <QTextCodec> #include <QDebug> #include <QMainWindow> #include <QAction> #include <MediaObject> #include <VideoWidget> #include <AudioOutput> #include <VolumeSlider> #include <QSizePolicy> #include <SeekSlider> #include <QToolBar> #include <QList> #include <QHBoxLayout> #include <QVBoxLayout> #include <QGridLayout> #include <QStyle> #include <QKeyEvent> #include <QLabel> #include <QMessageBox> #include <QFont> #include <QLCDNumber> #include <QTime> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: Phonon::MediaObject *mediaObject; Phonon::VideoWidget *videoWidget; Phonon::AudioOutput *audioOutput; Phonon::VolumeSlider *volumeSlider; Phonon::SeekSlider *seekSlider; QList<Phonon::MediaObject> sourceList; QAction *playAction; QAction *stopAction; QAction *nextAction; QAction *previousAction; QAction *fullScreenAction; QAction *skipForwardAction; QAction *skipBackAction; QLabel *playStateLabel; QLCDNumber *timeLcd; void setupUi(); void setupActions(); private slots: void fullOrNormalScreen(); void playOrPause(); void keyPressEvent(QKeyEvent *); void mediaStateChanged(Phonon::State newState,Phonon::State oldState); void tick(qint64); }; #endif // MAINWINDOW_H #include "mainwindow.h" #include <QTextEdit> #include <QDockWidget> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowIcon(QIcon(":/images/video.png")); mediaObject = new Phonon::MediaObject(this);//MediaObject 用于对媒体流基本控制,如播放,暂停,停止等,通过读取MediaSource audioOutput = new Phonon::AudioOutput(Phonon::VideoCategory,this);//播放声音 videoWidget = new Phonon::VideoWidget(this);//影片播放 volumeSlider = new Phonon::VolumeSlider(this);//声音进度条 seekSlider = new Phonon::SeekSlider(this);//影片播放进度条 seekSlider->setMediaObject(mediaObject);//关联播放进度条到影片 volumeSlider->setAudioOutput(audioOutput);//关联声音控制条到影片 videoWidget->setAspectRatio(Phonon::VideoWidget::AspectRatioWidget); volumeSlider->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum);//设置音量最大 Phonon::createPath(mediaObject,audioOutput);//建立一个Path,连接两个MediaNodes,就是source与sink Phonon::createPath(mediaObject,videoWidget); setupActions(); setupUi(); mediaObject->setCurrentSource(Phonon::MediaSource("E:/Movie/lian/枪王之王.RMVB"));//设定MediaObject的多媒体来源 mediaObject->setTickInterval(1000); timeLcd->display("00:00"); } MainWindow::~MainWindow() { } void MainWindow::setupActions() { playAction = new QAction(style()->standardIcon(QStyle::SP_MediaPlay), "播放", this); playAction->setShortcut(tr("Ctrl+P")); stopAction = new QAction(style()->standardIcon(QStyle::SP_MediaStop), "停止", this); stopAction->setShortcut(tr("Ctrl+S")); nextAction = new QAction(style()->standardIcon(QStyle::SP_MediaSkipForward), "下一个", this); nextAction->setShortcut(tr("Ctrl+N")); previousAction = new QAction(style()->standardIcon(QStyle::SP_MediaSkipBackward), "上一个", this); previousAction->setShortcut(tr("Ctrl+R")); fullScreenAction = new QAction("全屏", this); fullScreenAction->setShortcut(tr("Ctrl+Enter")); skipForwardAction = new QAction(style()->standardIcon(QStyle::SP_MediaSkipForward), "快进", this); skipBackAction = new QAction(style()->standardIcon(QStyle::SP_MediaSkipBackward), "快退", this); connect(playAction, SIGNAL(triggered()), this, SLOT(playOrPause())); connect(stopAction, SIGNAL(triggered()), mediaObject, SLOT(stop())); connect(fullScreenAction, SIGNAL(triggered()),this, SLOT(fullOrNormalScreen())); connect(mediaObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(mediaStateChanged(Phonon::State,Phonon::State))); connect(mediaObject, SIGNAL(tick(qint64)),this,SLOT(tick(qint64))); } void MainWindow::setupUi() { playStateLabel = new QLabel(); playStateLabel->setAlignment(Qt::AlignLeft); playStateLabel->setText("准备就绪"); timeLcd = new QLCDNumber(); timeLcd->setVisible(false); timeLcd->setFixedSize(100,15); playStateLabel->setFixedHeight(15); QFont font("Times", 8); playStateLabel->setFont(font); QGridLayout *statusLayout = new QGridLayout; statusLayout->addWidget(playStateLabel,0,0); statusLayout->addWidget(timeLcd,0,3); QToolBar *seekerBar = new QToolBar(); seekerBar->addAction(skipBackAction); seekerBar->addWidget(seekSlider); seekerBar->addAction(skipForwardAction); seekerBar->setFixedHeight(20); QVBoxLayout *seekerLayout = new QVBoxLayout; seekerLayout->addWidget(seekerBar); QToolBar *playControlBar = new QToolBar(); playControlBar->addAction(stopAction); playControlBar->addAction(previousAction); playControlBar->addAction(playAction); playControlBar->addAction(nextAction); playControlBar->addAction(fullScreenAction); playControlBar->setFixedHeight(30); QHBoxLayout *playControlLayout = new QHBoxLayout; playControlLayout->addWidget(playControlBar); playControlLayout->addWidget(volumeSlider); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(videoWidget); mainLayout->addLayout(statusLayout); mainLayout->addLayout(seekerLayout); mainLayout->addLayout(playControlLayout); QWidget *widget = new QWidget; widget->setLayout(mainLayout); setCentralWidget(widget); setWindowTitle("毛毛虫播放器"); } void MainWindow::playOrPause() { if(mediaObject->state() == Phonon::PlayingState) { mediaObject->pause(); } else { mediaObject->play(); } } void MainWindow::fullOrNormalScreen() { videoWidget->setFullScreen(true); } void MainWindow::keyPressEvent(QKeyEvent *keyEvent) { if(keyEvent->key() == Qt::Key_Escape) { videoWidget->setFullScreen(false); } } void MainWindow::mediaStateChanged(Phonon::State newState, Phonon::State oldState) { switch(newState) { case Phonon::ErrorState: if(mediaObject->errorType() == Phonon::FatalError) QMessageBox::warning(this,tr("Fatal Error"),mediaObject->errorString()); else QMessageBox::warning(this,tr("Error"),mediaObject->errorString()); break; case Phonon::PlayingState: playAction->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); timeLcd->setVisible(true); playStateLabel->setText("播放中"); break; case Phonon::PausedState: playAction->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); playStateLabel->setText("暂停"); break; case Phonon::StoppedState: playAction->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); timeLcd->setVisible(false); break; case Phonon::BufferingState: break; default: ; } } void MainWindow::tick(qint64 time) { QTime displayTime(0, (time / 60000) % 60, (time / 1000) %60); timeLcd->display(displayTime.toString("mm:ss")); }