Qt音频编程(实战)

参考 QMediaPlayer 类 |Qt 多媒体 5.15.18

QMediaPlaylist Class | Qt Multimedia 5.15.18

//mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QFileDialog>
#include<QFileInfo>
#include<QMessageBox>
#include <QMainWindow>
#include<QMediaPlayer>
#include<QMediaPlaylist>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_btn_open_clicked();

    void on_btn_play_clicked();

    void on_btn_pause_clicked();

    void on_btn_stop_clicked();

    void on_btn_begin_clicked();

    void on_btn_next_clicked();

    void on_pushButton_7_clicked();

    void on_horizontalSlider_valueChanged(int value);

    void on_horizontalSlider_2_valueChanged(int value);



private:
    Ui::MainWindow *ui;
    QMediaPlayer *player;
    QMediaPlaylist *playlist;

    QString drtTime; // 歌曲时长
    QString pstTime; // 播放位置
};
#endif // MAINWINDOW_H
//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);
    playlist=new QMediaPlaylist(this);
    player->setPlaylist(playlist);
    //当歌曲到达末尾时进行循环播放
    playlist->setPlaybackMode(QMediaPlaylist::Loop);


    //QMediaPlayer的播放状态(如播放中、暂停、停止等)发生变化时
    connect(player,&QMediaPlayer::stateChanged,this,[=](QMediaPlayer::State newState){
        // 播放按钮:当播放器不在播放状态时启用
        ui->btn_play->setDisabled(newState == QMediaPlayer::PlayingState);
        // 暂停按钮:当播放器处于播放状态时启用
        ui->btn_pause->setEnabled(newState == QMediaPlayer::PlayingState);
        // 停止按钮:通常可以在任何状态下启用,但这里我们假设它也只在播放时启用(根据需要调整)
        // 如果您希望在非播放状态下也能停止(比如从暂停状态),则应该移除下面的条件判断
        ui->btn_stop->setEnabled(newState == QMediaPlayer::PlayingState || newState == QMediaPlayer::PausedState);
    });

    //播放歌曲当前位置、更新变化情况
    connect(player,&QMediaPlayer::positionChanged,this,[=](qint64 pos ){
        if(ui->horizontalSlider_2->isSliderDown())
        {
            return;
        }
        int sec = pos / 1000; // 秒
        int min = sec / 60;   // 分
        sec = sec % 60;       // 剩余的秒
        //arg(min, 2, 10, QChar('0')) 2:这是字段宽度 10:这是10进制,'0':这是填充字符
        pstTime = QString("%1:%2").arg(min, 2, 10, QChar('0')).arg(sec, 2, 10, QChar('0'));
        ui->label_process->setText(pstTime + "/" + drtTime);
    });

    //当媒体内容的持续时间发生变化时,QMediaPlayer会发出这个信号。
    //这通常发生在媒体文件被加载或媒体流的信息更新时
    connect(player,&QMediaPlayer::durationChanged,this,[=](qint64 drt){
        ui->horizontalSlider_2->setMaximum(drt);

        int sec=drt/1000; // 秒
        int min=sec/60; // 分
        sec=sec%60; // 余数为秒

//        drtTime=QString::asprintf("%d:%d",min,sec);
        pstTime = QString("%1:%2").arg(min, 2, 10, QChar('0')).arg(sec, 2, 10, QChar('0'));
        ui->label_process->setText(pstTime+"/"+drtTime);
    });



    connect(playlist,&QMediaPlaylist::currentIndexChanged,this,[=](int pos){
        ui->listWidget->setCurrentRow(pos);
        QListWidgetItem *item=ui->listWidget->currentItem();
        if(item)
            ui->label_songname->setText(item->text());
    });
}


MainWindow::~MainWindow()
{
    delete ui;
}

//打开文件
void MainWindow::on_btn_open_clicked()
{
//    QString path=QDir::homePath();
    // 设置文件过滤器,只显示音频文件
    QStringList filters;
    filters<< "*.mp3" << "*.wav" << "*.ogg" << "*.flac";
    // 在Windows上,使用";;"作为多个过滤器之间的分隔符
    // 在其他平台上(如Linux和macOS),通常使用单个";"
    QString filter=filters.join(";;");
    QStringList files =QFileDialog::getOpenFileNames(this,"Select one or more files to open","..",filter);
    //选中0个返回
    if(files.count()<1)
    {
        return;
    }

    for(QString path1:files)
    {
        QFileInfo info(path1);
        //列表里添加元素


        ui->listWidget->addItem(info.fileName());
        playlist->addMedia(QMediaContent(QUrl::fromLocalFile(path1)));

    }
    if(player->state()!=QMediaPlayer::PlayingState)
    {
        playlist->setCurrentIndex(0);
    }
    player->play();

}
//播放
void MainWindow::on_btn_play_clicked()
{
    if(playlist->currentIndex()<0)
        playlist->setCurrentIndex(0);
    player->play();
}
//暂停
void MainWindow::on_btn_pause_clicked()
{
    player->pause();
}
//停止
void MainWindow::on_btn_stop_clicked()
{
    player->stop();
}
//上一曲
void MainWindow::on_btn_begin_clicked()
{
    playlist->previous();
}
//下一曲
void MainWindow::on_btn_next_clicked()
{
    playlist->next();
}
//是否静音
void MainWindow::on_pushButton_7_clicked()
{
    // 控制静音状态
    bool mute=player->isMuted();
    player->setMuted(!mute);
    if(mute)
    {
        ui->pushButton_7->setIcon(QIcon(":/images/volumn.bmp"));
    }
    else
    {
         ui->pushButton_7->setIcon(QIcon(":/images/mute.bmp"));
    }
}
//音量大小改变
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
    //设置音量大小
    player->setVolume(value);
}
//改变歌曲进度
void MainWindow::on_horizontalSlider_2_valueChanged(int value)
{
    //设置歌曲进度
    player->setPosition(value);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值