Qt之QMediaPlayer音频播放

举报
人才程序员 发表于 2023/11/30 17:58:12 2023/11/30
【摘要】 @TOC 前言Qt是一个流行的跨平台的GUI开发框架,也提供了许多常用功能的封装,其中包括音频播放功能。在这篇文章中,我将介绍Qt的QMediaPlayer类,以及如何使用它来播放音频文件。如想看到更多内容,请点击链接:Qt高级编程系列文章提示:以下是本篇文章正文内容,下面案例可供参考 QMediaPlayer简介QMediaPlayer类是Qt中专门用于音频和视频播放的类。它可以播放以多种...

@TOC


前言

Qt是一个流行的跨平台的GUI开发框架,也提供了许多常用功能的封装,其中包括音频播放功能。在这篇文章中,我将介绍Qt的QMediaPlayer类,以及如何使用它来播放音频文件。
如想看到更多内容,请点击链接:Qt高级编程系列文章


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

QMediaPlayer简介

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

QMediaPlayer使用方法

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

我们需要的头文件:

QT += multimedia--->.pro中
#include <QMediaPlayer> --->在头文件/源文件中

申请对象:

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 <QDebug>

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<l.count();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 <QMainWindow>
#include <QMediaPlayer>
#include <QFileDialog>
#include <QMediaPlaylist>

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应用程序更生动和更有趣!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。