QT 音频组件
Qt提供的多媒体可以从高层到底层进行访问, 以及处理音频的输出和输入。Qt为了开发基于多媒体的应用程序,可以使用QMediaPlayer类.
操作体统平台不仅支持从属的压缩音频格式,也支持用户安装的多媒体插件.
播放多媒体使用到QMediaPlayer类,需要在.pro文件中添加 QT += multimedia
1:最简单的音乐播放器的实现
- 最简单例子
QMediaPlayer * player = new QMediaPlayer;
player‐>setMedia(QUrl::fromLocalFile("c:\\123.MP3"));
player‐>setVolume(50);
player‐>play();
2:常用函数
[public slot] void QMediaPlayer::play() //播放
[public slot] void QMediaPlayer::pause() //暂停
[public slot] void QMediaPlayer::stop() //停止
[public slot] void QMediaPlayer::setVolume(int volume); //设置音量
[public slot] void QMediaPlayer::setMedia(const QMediaContent &media, QIODevice *stream =
Q_NULLPTR); //设置多媒体资源.
[public slot] void QMediaPlayer::setPlaylist(QMediaPlaylist *playlist); //设置播放资源
[public slot] void QMediaPlayer::setPosition(qint64 position); //设置资源位置
3:例子
注意://使用多媒体需要在pro文件中添加“multimedia”
(1)main.cpp
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
(2)widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMediaPlayer>
#include <QLabel>
#include <QMediaPlaylist>
#include <QSlider>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
public slots:
void openFileSlot();
void changeNameSlot(const QMediaContent &content);
void durationChangedSlot(qint64);
void positionChangedSlot(qint64);
void changePosition();
private:
QMediaPlayer* _player;
QLabel* _fileNameLabel;
QLabel* _totalTimeLabel;
QLabel* _currentTimeLabel;
QMediaPlaylist* _playlist;
QSlider* _timeSlider;
};
#endif // WIDGET_H
(3)widget.cpp
#pragma execution_character_set("utf-8")
#include "widget.h"
#include <QMediaPlayer>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QLabel>
#include <QSlider>
//使用多媒体需要在pro文件中添加“multimedia”
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
/*多媒体初始化*/
_player = new QMediaPlayer(this);
_playlist = new QMediaPlaylist(this); //用于提供播放列表
_player->setPlaylist(_playlist);
_player->setVolume(50); //设置初始的音量大小
_playlist->setPlaybackMode(QMediaPlaylist::Random); //播放模式设置:随机播放
/*显示当前播放的歌曲文件*/
_fileNameLabel = new QLabel("wait");
QVBoxLayout* vBox = new QVBoxLayout(this);
vBox->addWidget(_fileNameLabel);
/*歌曲时间*/
QHBoxLayout* hBox2 = new QHBoxLayout;
_totalTimeLabel = new QLabel("00:00:00");
_currentTimeLabel= new QLabel("/00:00:00");
_timeSlider = new QSlider;
_timeSlider->setOrientation(Qt::Horizontal); //将音量设为水平滑动块
_timeSlider->setMinimum(0);
_timeSlider->setMaximum(0);
// _timeSlider->setDisabled(true); //设置灰显
hBox2->addWidget(_totalTimeLabel);
hBox2->addWidget(_currentTimeLabel);
hBox2->addWidget(_timeSlider);
vBox->addLayout(hBox2);
/*音量控制*/
QHBoxLayout* hBox0 = new QHBoxLayout;
vBox->addLayout(hBox0);
hBox0->addWidget(new QLabel("音量:"));
QSlider * volumeSlider = new QSlider;
hBox0->addWidget(volumeSlider);
volumeSlider->setOrientation(Qt::Horizontal); //将音量设为水平滑动块
volumeSlider->setMinimum(0);
volumeSlider->setMaximum(100);
volumeSlider->setValue(_player->volume());
/*控制按钮*/
QHBoxLayout* hBox1 = new QHBoxLayout;
QPushButton* play_pb = new QPushButton("播放");
QPushButton* open_pb = new QPushButton("打开");
QPushButton* pause_pb = new QPushButton("暂停");
QPushButton* stop_pb = new QPushButton("停止");
QPushButton* next_pb = new QPushButton("下一首");
QPushButton* previous_pb = new QPushButton("上一首");
hBox1->addWidget(open_pb);
hBox1->addWidget(play_pb);
hBox1->addWidget(pause_pb);
hBox1->addWidget(stop_pb);
hBox1->addWidget(next_pb);
hBox1->addWidget(previous_pb);
vBox->addLayout(hBox1);
this->setLayout(vBox);
connect(play_pb,SIGNAL(clicked()),_player,SLOT(play()));
connect(open_pb,SIGNAL(clicked()),this,SLOT(openFileSlot()));
connect(pause_pb,SIGNAL(clicked()),_player,SLOT(pause()));
connect(stop_pb,SIGNAL(clicked()),_player,SLOT(stop()));
connect(next_pb,SIGNAL(clicked()),_playlist,SLOT(next()));
connect(previous_pb,SIGNAL(clicked()),_playlist,SLOT(previous()));
connect(_playlist,SIGNAL(currentMediaChanged(QMediaContent)),this,SLOT(changeNameSlot(QMediaContent)));
connect(volumeSlider,SIGNAL(valueChanged(int)),_player,SLOT(setVolume(int)));
connect(_player,SIGNAL(durationChanged(qint64)),this,SLOT(durationChangedSlot(qint64)));
//_player发出信号时时长显示与滑动条改变
connect(_player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChangedSlot(qint64)));
connect(_timeSlider,SIGNAL(sliderReleased()),this,SLOT(changePosition()));
}
//时长滑动条发出信号播放到拖动的位置,释放时发送信号
void Widget::changePosition() {
_player->setPosition(_timeSlider->value()*1000);
}
//_player发出信号时时长显示与滑动条改变
void Widget::positionChangedSlot(qint64 position){
qDebug()<<__FUNCTION__<<position<<endl;
position /=1000;
_timeSlider->setValue(position); //设置滑动条值改变
//设置当前时间
_currentTimeLabel->setText(QString::asprintf("/ %02d:%02d:%02d",
position/3600,position%3600/60,position%60));
}
void Widget::durationChangedSlot(qint64 duration) {
duration /=1000;
_timeSlider->setMaximum(duration);
_totalTimeLabel->setText(QString::asprintf("%02d:%02d:%02d",duration/3600,duration%3600/60,duration%60)); //"02"表示前面不足两位补0
}
void Widget::changeNameSlot(const QMediaContent &content) {
_fileNameLabel->setText(content.canonicalUrl().fileName());
}
/*打开一个MP3文件*/
void Widget::openFileSlot() {
//打开多个MP3文件
QStringList fileNameList = QFileDialog::getOpenFileNames(this,"MP3","","audio(*.mp3)");
foreach (QString fileName, fileNameList) {
QFileInfo fileInfo(fileName);
if(fileInfo.isFile()) {
// _fileNameLabel->setText(fileInfo.fileName()); //MP3文件的名称
// _player->setMedia(QMediaContent(QUrl::fromLocalFile(fileName)));
_playlist->addMedia(QUrl::fromLocalFile(fileName));
}
}
//打开一个MP3文件
// QString fileName = QFileDialog::getOpenFileName(this,"MP3","","audio(*.mp3)");
// QFileInfo fileInfo(fileName);
// if(fileInfo.isFile()) {
// // _fileNameLabel->setText(fileInfo.fileName()); //MP3文件的名称
// // _player->setMedia(QMediaContent(QUrl::fromLocalFile(fileName)));
// _playlist->addMedia(QUrl::fromLocalFile(fileName));
// }
}
Widget::~Widget()
{
}