qt音频实战

一、Qt音频基础知识

1、QT += multimedia

2、QMediaPlayer类:媒体播放器,主要用于播放歌曲、网络收音机等功能。

3、QMediaPlaylist类:专用于播放媒体内容的列表。

二、界面设计

三、代码

复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_player = new QMediaPlayer;
    m_playlist = new QMediaPlaylist;

    //设置播放模式
    m_playlist->setPlaybackMode(QMediaPlaylist::Loop);
    m_player->setPlaylist(m_playlist);

    connect(m_player, SIGNAL(statechanged(QMediaPlayer::State)), this, SLOT(onstatechg(QMediaPlayer::State)));
    connect(m_player, SIGNAL(positionChanged(qint64)), this, SLOT(onpstChg(qint64)));
    connect(m_player, SIGNAL(durationChanged(qint64)), this, SLOT(onDrtchg(qint64)));
    connect(m_playlist, SIGNAL(currentIndexChanged(int)), this, SLOT(onplaylistchg(int)));
}

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

void MainWindow::onstatechg(QMediaPlayer::State state)    //按钮状态切换
{
    ui->playBtn->setEnabled(!(state == QMediaPlayer::PlayingState));
    ui->pauseBtn->setEnabled(state == QMediaPlayer::PlayingState);
    ui->stopBtn->setEnabled(state == QMediaPlayer::PlayingState);
}
void MainWindow::onplaylistchg(int pos)                   //播放列表更新
{
    ui->listWidget->setCurrentRow(pos);
    QListWidgetItem *item = ui->listWidget->currentItem();
    if(item)
        ui->nameLab->setText(item->text());

}
void MainWindow::onDrtchg(qint64 drt)                     //歌曲时长
{
    ui->progressBar->setMaximum(drt);

    int sec = drt/1000;
    int min = sec/60;
    sec = sec % 60;

    drtTime = QString::asprintf("%d:%d", min, sec);
    ui->progressLab->setText(pstTime+"|"+drtTime);

}
void MainWindow::onpstChg(qint64 pos)                     //歌曲当前播放位置
{
    if(ui->progressBar->isSliderDown())
        return;

    ui->progressBar->setSliderPosition(pos);

    int sec = pos/1000;
    int min = sec/60;
    sec = sec % 60;

    pstTime = QString::asprintf("%d:%d", min, sec);
    ui->progressLab->setText(pstTime+"|"+drtTime);
}


void MainWindow::on_openFileBtn_clicked()
{
    QString currentpath = QDir::currentPath();
    QString dlgtitle = "请选择音频文件:";
    QString strfilter = "所有文件(*.*);;音频文件(*.mp3);;MP3文件(*mp3)";

    QStringList filelist = QFileDialog::getOpenFileNames(this, dlgtitle, currentpath,strfilter);

    if(filelist.count()<1)
        return;

    for(int i = 0;i < filelist.count(); i++)
    {
        QString afile = filelist.at(i);
        m_playlist->addMedia(QUrl::fromLocalFile(afile)); //添加文件

        QFileInfo fileinfo(afile);
        ui->listWidget->addItem(fileinfo.fileName());
    }

    if(m_player->state()!=QMediaPlayer::PlayingState)
        m_playlist->setCurrentIndex(0);
    m_player->play();
}


void MainWindow::on_playBtn_clicked()
{
    if(m_playlist->currentIndex()<0)
        m_playlist->setCurrentIndex(0);
    m_player->play();
}


void MainWindow::on_pauseBtn_clicked()
{
    m_player->pause();
}


void MainWindow::on_stopBtn_clicked()
{
    m_player->stop();
}


void MainWindow::on_PreviousBtn_clicked()
{
    m_playlist->previous();
}


void MainWindow::on_nextBtn_clicked()
{
    m_playlist->next();
}


void MainWindow::on_volumnBtn_clicked()        //切换音量图标(需要添加图片资源到项目)
{
    bool mute = m_player->isMuted();

    m_player->setMuted(!mute);
    if(mute)
    {
        ui->volumnBtn->setIcon(QIcon(":/icon/volumn.png"));
    }
    else
    {
        ui->volumnBtn->setIcon(QIcon(":/icon/novolume.png"));
    }
}


void MainWindow::on_volumnBar_valueChanged(int value)     //音量调节
{
    m_player->setVolume(value);
}


void MainWindow::on_progressBar_valueChanged(int value)   //进度调节
{
    m_player->setPosition(value);
}
相关推荐
Felix_One4 天前
Qt 串口通信避坑指南:QSerialPort 的 5 个常见问题
qt
blasit7 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
郑州光合科技余经理12 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo12312 天前
matlab画图工具
开发语言·matlab
dustcell.12 天前
haproxy七层代理
java·开发语言·前端
norlan_jame12 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone12 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ40220549612 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月12 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_5312371712 天前
C语言-数组练习进阶
c语言·开发语言·算法