Qt之QMediaPlayer音频播放

Qt之QMediaPlayer音频播放

@TOC

前言

Qt是一个流行的跨平台的GUI开发框架,也提供了许多常用功能的封装,其中包括音频播放功能。在这篇文章中,我将介绍Qt的QMediaPlayer类,以及如何使用它来播放音频文件。

如想看到更多内容,请点击链接:Qt高级编程系列文章

提示:以下是本篇文章正文内容,下面案例可供参考

QMediaPlayer简介

QMediaPlayer类是Qt中专门用于音频和视频播放的类。它可以播放以多种格式存储的音频文件,如MP3、WAV、OGG等。要使用QMediaPlayer类,您需要在您的Qt项目中包含#include 文件。

QMediaPlayer使用方法

在使用前我们需要保证我们是否安装了QMedia组件,我们可以打开Qt安装路径->MaintenanceTool…进行安装。

我们需要的头文件:

QT += multimedia--->在.pro中

#include --->在头文件/源文件中

申请对象:

player = new QMediaPlayer;

设置播放源:

一旦创建了QMediaPlayer对象,您就可以使用它来播放音频文件。请注意,要播放音频文件,您首先需要将文件的路径(绝对路径或相对路径)传递给QMediaPlayer对象。在此之后,您可以通过以下方式播放音频文件:

player->setMedia(QUrl::fromLocalFile(path));

设置音量:

默认值为100

范围为0~100

player->setVolume(n);

开始:

player->play();

暂停:

player->pause();

停止:

player->stop();

暂停和停止的区别:

暂停:下次播放时从暂停的位置开始播放‘

停止:下次播放时从0开始播放

获取音频总时长:

当我们选择文件play()后,他会发送durationChanged信号,标志着已经计算好了音频的总时长,参数为音频时长,单位为ms

connect(player,&QMediaPlayer::durationChanged,this,&MainWindow::onDrtChg);

void MainWindow::onDrtChg(qint64 drt)

{

int sec = drt/1000;

int min = sec/60;

sec = sec%60;//余数为秒

}

获取音频播放的时长:

connect(player,&QMediaPlayer::positionChanged,this,&MainWindow::onPstCha);

void MainWindow::onPstCha(qint64 pos)

{

int sec = pos/1000;

int min = sec/60;

sec = sec%60;//余数为秒

}

和获取总时长是一样的,只不过他每秒都会发送这个信号positionChanged,参数为现在的播放时间,单位为ms。

设置倍数:

player->setPlaybackRate(qreal rate);

此属性保存当前媒体的播放速率。

此值是应用于媒体标准播放速率的乘数。默认情况下,此值为 1.0,表示媒体正在以标准速度播放。高于 1.0 的值将增加播放率。可以设置小于零的值,并指示媒体将以标准配速的乘数倒带。

并非所有播放服务都支持更改播放速率。它是在快进或快退时定义音频和视频的状态和质量的框架。

具体使用我们后面会带大家写。

设置现在播放的地方:

单位为ms

player->setPosition(n);

QMediaPlayList使用方法

在日常的音频播放软件,都有一个歌曲列表,他允许我们上下切换歌曲,QMediaPlayList的功能就是这个。

申请对象:

playlist = new QMediaPlaylist;

添加播放源:

playlist->addMedia(QUrl("music.mp3"));

设置播放下标:

playlist->setCurrentIndex(1);

把QMediaPlayList设置进QMediaPlay中:

player->setPlaylist(playlist);

当需要上、下歌曲的时候,只需要先获取当前的index,然后++,取余count().

简单的mp3播放器

.ui:

槽函数大家根据自己的变量名来连接就可以了

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

player = new QMediaPlayer(this);

player->setPlaylist(MusicPath);

connect(player,&QMediaPlayer::durationChanged,this,&MainWindow::onDrtChg);

connect(player,&QMediaPlayer::positionChanged,this,&MainWindow::onPstCha);

}

//获取音频总时长

void MainWindow::onDrtChg(qint64 drt)

{

qDebug() << "onDrtChg(qint64 drt)" << drt;

ui->horizontalSlider_2->setMaximum(drt);

int sec = drt/1000;

int min = sec/60;

sec = sec%60;//余数为秒

drtTime = QString::asprintf("%d:%d",min,sec);

ui->label_2->setText(pstTime+QString("/")+drtTime);

}

//获取现在位置

void MainWindow::onPstCha(qint64 pos)

{

if(ui->horizontalSlider_2->isSliderDown())//当进度条被拖动时,退出,不进行下面的操作

return ;

ui->horizontalSlider_2->setSliderPosition(pos);

int sec = pos/1000;

int min = sec/60;

sec = sec%60;//余数为秒

pstTime = QString::asprintf("%d:%d",min,sec);

ui->label_2->setText(pstTime+QString("/")+drtTime);

qDebug() << ui->label_2->text();

}

MainWindow::~MainWindow()

{

delete ui;

}

//设置音量

void MainWindow::on_horizontalSlider_valueChanged(int value)

{

player->setVolume(value);

}

//选择文件

void MainWindow::on_pushButton_clicked()

{

QFileDialog f;

f.setAcceptMode(QFileDialog::AcceptOpen);

f.setNameFilter(tr("Music (*.mp3 *.wav)"));

if(f.exec() == QFileDialog::Accepted)

{

QStringList l = f.selectedFiles();

for(int i = 0;i

{

MusicPath.addMedia(l[i]);

player->setMedia(QUrl::fromLocalFile(l[i]));

ui->listWidget->addItem(QFileInfo(l[i]).fileName());

ui->label->setText(QFileInfo(l[i]).fileName());

}

MusicPath.next();

}

player->play();

}

//开启

void MainWindow::on_pushButton_2_clicked()

{

player->play();

}

//暂停

void MainWindow::on_pushButton_3_clicked()

{

player->pause();

}

//停止

void MainWindow::on_pushButton_4_clicked()

{

player->stop();

}

//下一曲

void MainWindow::on_pushButton_5_clicked()

{

MusicPath.next();

}

//上一曲

void MainWindow::on_pushButton_6_clicked()

{

MusicPath.previous();

}

//禁音按钮

void MainWindow::on_pushButton_7_clicked(bool checked)

{

if(checked)

{

player->setVolume(this->volum);

ui->horizontalSlider->setValue(this->volum);

}

else

{

this->volum = ui->horizontalSlider->value();

ui->horizontalSlider->setValue(0);

}

}

//当点击列表上的东西时播放

void MainWindow::on_listWidget_currentRowChanged(int currentRow)

{

playlist->setCurrentIndex(currentRow);

}

//设置位置

void MainWindow::on_horizontalSlider_2_valueChanged(int value)

{

player->setPosition(value);

}

mainWindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include

#include

#include

#include

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

QMediaPlayer *player;

QMediaPlaylist MusicPath;//歌曲路径列表

QString drtTime;//歌曲时长

QString pstTime;//播放位置

int volum;//音量

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

private:

Ui::MainWindow *ui;

private slots:

void onDrtChg(qint64 drt);//歌曲时长

void onPstCha(qint64 pos);//播放位置

void on_horizontalSlider_valueChanged(int value);

void on_pushButton_clicked();

void on_pushButton_2_clicked();

void on_pushButton_3_clicked();

void on_pushButton_4_clicked();

void on_pushButton_5_clicked();

void on_pushButton_6_clicked();

void on_pushButton_7_clicked(bool checked);

void on_listWidget_currentRowChanged(int currentRow);

void on_horizontalSlider_2_valueChanged(int value);

};

#endif // MAINWINDOW_H

总结

Qt的QMediaPlayer类是播放音频文件的强大工具。您可以使用它轻松地播放多种格式的音频文件,并附加功能如音量调整和状态响应。在其中使用您的音频文件,使您的Qt应用程序更生动和更有趣!

相关文章