开发者社区> 思禽> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

使用Qt做一个简易音乐播放器[Phonon浅谈--续]

简介:
+关注继续查看


2010-2-13 使用Qt做一个简易音乐播放器【Phonon浅谈--续】

 

在第一篇Phonon浅谈中提及到了Phonon这个多媒体框架的一些基本知识,于是想着结合这些基本知识来实践一番,做一个简单的音乐播放器。

 

【步骤一】

新建一个Qt Gui工程,在建立过程中需要包含Phonon模块,之后生成文件如下图:

Qt Gui工程会生成一个ui文件,在这里是mainwindow.ui。双击mainwindow.ui进行一番简单的布局,如下图:

关于这个ui界面,中央位置是一个QListWidget,用来显示音乐文件列表;下面一栏红色矩形是一个QVBoxLayout垂直布局部件,用来确定等会要建立的播放进度条的位置;而下面则是四个相关控制按钮。

大概地说,Phonon的工作机制是使用MediaObject来管理MediaSource即源文件,通过Path连接到AudioOutput,最后是由AudioOutput将数据发送到相关物理设备。

于是有了步骤二。

 

【步骤二】

步骤一是用来实现基本的界面,而步骤二是用代码实现具体的功能。

基于对Phonon的认识,有了以下四点:

使用MediaObject管理媒体源

使用AudioOutput连接物理设备

使用SeekSlider实现进度条

使用QList实现播放列表

于是产生了相应的代码:

Phonon::MediaObject *mediaObject; Phonon::AudioOutput *audioOutput; Phonon::SeekSlider *seekSlider; QList<Phonon::MediaSource> sourceList;//播放列表

并且需要在构造函数里面将 mediaObject audioOutput 连接起来:

Phonon::createPath(mediaObject, audioOutput);

从而使得数据能从 mediaObject 到达 audioOutput ,再通过物理设备播放。

 

1、  要播放音乐首先需要有源文件,所以先实现添加文件的功能。

首先,将添加按钮和添加功能连接起来:

connect(this->ui->addBtn, SIGNAL(clicked()), this, SLOT(addFiles()));

              从而实现点击按钮激活相应操作的功能,而添加音乐文件的槽的代码如下:

void MainWindow::addFiles(){ QStringList files = QFileDialog::getOpenFileNames(this, tr("Selec Files to play")); QString file; foreach(file, files){ this->ui->listWidget->addItem(file); sourceList.append(file); } }

上述代码是使用 QFileDialog getOpenFileNames 方法获取若干个音乐文件,然后再使用 Qt 中的 foreach 遍历每个选中的文件,将其添加到播放列表中。

2、  播放、暂停和停止的基本实现

同样的先将信号和槽连接起来:

connect(this->ui->playBtn, SIGNAL(clicked()), this, SLOT(playFile())); connect(this->ui->pauseBtn, SIGNAL(clicked()), this, SLOT(pauseFile())); connect(this->ui->stopBtn, SIGNAL(clicked()), this, SLOT(stopFile()));

              之后再具体实现相应的简单功能,这里列出 playFile 的代码:

void MainWindow::playFile(){ if(sourceList.isEmpty()){ QMessageBox::information(this, tr("no music files"), tr("no files to play")); return ; } mediaObject->setQueue(sourceList); mediaObject->play(); this->ui->playBtn->setEnabled(false); this->ui->pauseBtn->setEnabled(true); }

首先判断列表是否为空,接着设置播放队列,然后播放当前文件,最后使得播放按钮不可用,而激活暂停按钮。其它的功能类似,都是使用 mediaObject 的方法。

 

【步骤三】

这里只简单地实现播放功能,当然还是可以再继续扩展功能,不过这是后话了。

运行的效果图如下:

此时就能听见蛮好听的《左边》了^_^

 

以下是全部代码:

mainwindow.h:

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <Phonon> #include <QList> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); protected: void changeEvent(QEvent *e); private slots: void addFiles(); void playFile(); void pauseFile(); void stopFile(); private: Ui::MainWindow *ui; Phonon::MediaObject *mediaObject; Phonon::AudioOutput *audioOutput; Phonon::SeekSlider *seekSlider; QList<Phonon::MediaSource> sourceList;//播放列表 }; #endif // MAINWINDOW_H

mainwindow.cpp:

#include <QtGui> #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); connect(this->ui->addBtn, SIGNAL(clicked()), this, SLOT(addFiles())); connect(this->ui->playBtn, SIGNAL(clicked()), this, SLOT(playFile())); connect(this->ui->pauseBtn, SIGNAL(clicked()), this, SLOT(pauseFile())); connect(this->ui->stopBtn, SIGNAL(clicked()), this, SLOT(stopFile())); mediaObject = new Phonon::MediaObject(this); audioOutput = new Phonon::AudioOutput(this); seekSlider = new Phonon::SeekSlider(this); Phonon::createPath(mediaObject, audioOutput); seekSlider->setMediaObject(mediaObject); this->ui->seekLayout->addWidget(seekSlider); } MainWindow::~MainWindow() { delete ui; } void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void MainWindow::addFiles(){ QStringList files = QFileDialog::getOpenFileNames(this, tr("Selec Files to play")); QString file; foreach(file, files){ this->ui->listWidget->addItem(file); sourceList.append(file); } } void MainWindow::playFile(){ if(sourceList.isEmpty()){ QMessageBox::information(this, tr("no music files"), tr("no files to play")); return ; } mediaObject->setQueue(sourceList); mediaObject->play(); this->ui->playBtn->setEnabled(false); this->ui->pauseBtn->setEnabled(true); } void MainWindow::pauseFile(){ mediaObject->pause(); this->ui->pauseBtn->setEnabled(false); this->ui->playBtn->setEnabled(true); } void MainWindow::stopFile(){ mediaObject->stop(); this->ui->pauseBtn->setEnabled(true); this->ui->playBtn->setEnabled(true); }

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(); }

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Qt | 播放音频文件 QMediaplayer
QMediaplayer的使用方法以及遇到的问题。
0 0
Qt+MPlayer音乐播放器开发笔记(二):交叉编译MPlayer以及部署到开发板播放演示
Qt+MPlayer音乐播放器开发笔记(二):交叉编译MPlayer以及部署到开发板播放演示
0 0
Qt实用技巧:Qt从QtCreator更换为VS开发Qt所需要注意的坑
Qt实用技巧:Qt从QtCreator更换为VS开发Qt所需要注意的坑
0 0
视频播放器:QtCreator运行VLC-Qt官方示例代码
视频播放器:QtCreator运行VLC-Qt官方示例代码
0 0
Qt HUD(平显)演示程序绿色版
把一个黑底白字的程序改成黑底绿字
0 0
qt启动画面实现
在程序启动时常由于加载数据或加载库文件会一段时间才弹出主窗口,期间心急或不明所以的用户会以为 app有问题,“咋半天没反应呢”,这时添加启动画面及告诉用户数据在加载中,qt已经集成了该功能-QSplashScreen ,直接调用即可。
633 0
基于QT的mplayer播放器
一、项目概述 Mplayer。它支持大量的多媒体文件格式,像常见的音频文件如mp3/wav/mid,常见的视频文件如avi/vcd/dvd/rm等等,各种视频编/解码方式也是应有尽有。
1111 0
QT控制mplayer
1.MPlayer 的特殊控制模式    MPlayer 本身是一个命令行的程序,但是他提供了有后台模式(Slave),可以把自己输出重定向到一个指定的X Windows窗口中,并且可以通过管道向其发送命令来控制,这样就为GUI程序提供一个简单的编程接口.
785 0
+关注
思禽
一个写着几行代码的理工科文学青年
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载