QT 音频组件

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()
{

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值