QT学习之音频操作(入门)


对于音频编程的基本概念不熟悉的可以去参考我的另一篇博文:音频的一些基本概念

因为录取到的数据是arw格式原始数据,是不能直接播放的,因此需要编程来实现播放


1、创建一个qt工程

我这里创建的是继承于MainWindow窗口类的工程,然后在工程文件.pro中添加multimedia模块,这是qt中对音频操作所需的音频模块
在这里插入图片描述



2、添加所需头文件

添加好工程所需模块后,就可以添加对应头文件

录入音频数据所需的头文件
#include <QAudioInput> 

输出音频数据进行播放所需的头文件
#include <QAudioOutput> 

设置音频对象格式所需的头文件
#include <QAudioFormat>


3、相关函数

下面的函数是用于初始化音频操作对象对音频操作时的数据,主要调用QAudioFormat类进行定义初始化音频对象的格式,然后在创建QAudioInput/QAudioOutput对象时把初始化数据传递进去对音频对象进行初始化

以下所有函数为QAudioFormat类中的成员函数

3.1.设置字节顺序

字节序分为LittleEndian(低位优先)/LargeEndian(高位优先)
注意:需要录音与播放的字节序必须一致

setByteOrder(QAudioFormat::LittleEndian);//设置端字节序:小端字节序

3.2.设置通道数

通道分为单声道(平声道)与双声道(立体声:包括左右声道)
mono(平声道)的声道数目是1stero(立体声)的声道数目是2

setChannelCount(2);//两通道

3.3.设置编码器

一般使用"audio/pcm"编码器,因为在所有的平台上都支持,
也就相当于音频格式的WAV,以线性方式无压缩的记录捕捉到的数据。
如想使用其他编码格式 ,可以通过QAudioDeviceInfo::supportedCodecs()获取所支持的编码器

setCodec("audio/pcm");//设置编码器

3.4.设置采样频率

采样率是每秒钟对声音的采样次数,越大当然越精细,
常用的即为44100HZ(标准CD级)

setSampleRate(44100);//采样率44100

3.5.设置样本长度

样本长度(量化深度)SampleSize主要使用8/16bit,样本长度越长声音质量越好
若使用8bit采集数据则该采样点有2^8 = 256种量化值(即0-255)
若使用16bit采集数据则该采样点有2^16 = 65536种量化值(64k)

setSampleSize(16);//样本长度设置16

3.6.样本数据类型

采样数据类型有:
为QAudioFormat::SignedInt	//样本数据是符号整型
QAudioFormat::UnSignedInt	//样本数据是无符号整型
QAudioFormat::Float			//样本数据是浮点型
根据采样的数据选择对应的类型

setSampleType(QAudioFormat::UnSignedInt);//存储样本数据类型:UnSigned Int


4、示例代码

ui界面如下
在这里插入图片描述

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAudioInput>  //音频录入头文件
#include <QAudioOutput> //音频输出头文件
#include <QFile>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

protected slots:
    void changed(QAudio::State state);  //状态改变时的槽函数
    
private slots:
    void on_pushButton_clicked();   //录音
    
    void on_pushButton_2_clicked(); //停止录音

    void on_pushButton_3_clicked(); //获取文件路径

    void on_pushButton_4_clicked(); //播放音频

private:
    Ui::MainWindow *ui;
    QAudioInput *input;     //录音的操作对象
    QAudioOutput *output;   //播放音频的操作对象
    QFile SaveFile;         //用于每次打开保存的文件路径
    QFile OpenFile;         //打开播放的文件路径

};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>
#include <QFileDialog>


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

    //用于初始化
    QAudioFormat format;
    format.setSampleRate(44100);//采样率
    format.setChannelCount(2);//通道
    format.setSampleSize(16);//样本长度
    format.setByteOrder(QAudioFormat::LittleEndian);//设置端字节序:小端序
    format.setSampleType(QAudioFormat::UnSignedInt);//存储样本数据类型
    format.setCodec("audio/pcm");//这个用来设置编码器为audio/pcm,该编码器为所有平台支持

    //监测当前设置是否支持format设置的格式
    QAudioDeviceInfo infodev = QAudioDeviceInfo::defaultInputDevice();
    if(!infodev.isFormatSupported(format))
    {//不支持打印一下
        qDebug()<<"format";
    }

    //设置录音对象的格式
    input = new QAudioInput(format,this);

    //设置播放音频对象格式,关联状态槽函数,当状态改变后将触发该槽函数
    /*
    	当播放音频时,状态改变就会发出一个stateChanged信号,一共有五种状态
         enum State { ActiveState,   //运行状态
                      SuspendedState, // 挂起状态
                      StoppedState, //停止状态
                      IdleState,    //空闲状态
                      InterruptedState //中断状态
          };
    */
    output = new QAudioOutput(format,this);
    connect(output,&QAudioOutput::stateChanged,this,&MainWindow::changed);

}

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


//点击开始录音
void MainWindow::on_pushButton_clicked()
{
    QString name = ui->lineEdit_2->text();//获取保存的文件名,默认路径在当前目录
    if(name.isEmpty())
    {
        name="my.raw";
    }

    OpenFile.setFileName(name);
    OpenFile.open(QIODevice::ReadWrite);

    qDebug()<<name;
    //开始录音并且给一个文件路径
    input->start(&OpenFile);

}

//点击停止录音
void MainWindow::on_pushButton_2_clicked()
{
    //停止录音,关闭文件,不关闭数据不会真正写入文件
    input->stop();
    OpenFile.close();
}

//获取文件路径
void MainWindow::on_pushButton_3_clicked()
{
    QString fileName = QFileDialog::getOpenFileName();//弹出文件对话框获取文件路径与名称
    ui->lineEdit->setText(fileName);

}


//播放音频
void MainWindow::on_pushButton_4_clicked()
{
    QString name = ui->lineEdit->text();
    SaveFile.setFileName(name);
    SaveFile.open(QFileDevice::ReadOnly);   //打开音频文件只读
    output->start(&SaveFile);
}


//当播放音频完毕后响应的槽函数
void MainWindow::changed(QAudio::State state)
{
    if(state == QAudio::IdleState)
    {
        SaveFile.close();
    }
}


main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}




5、运行结果

测试环境:Qt Creator 4.13.2
在这里插入图片描述

  • 15
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: QWave是一款基于Qt框架开发的音频波形显示控件,可以用来在Qt应用程序中实现音频波形的显示和控制。该控件支持WAV、MP3、OGG等常用音频格式,支持多种显示模式和操作,可以实现实时显示、滚动播放和缩放等功能。通过使用QWave控件,可以轻松地开发出具有音频功能的多媒体应用程序,如音频播放器、录音器等。 同时,QWave控件还支持跨平台运行,可以在多种操作系统和Qt版本下运行。其开源免费的特点,也为广大开发者提供了便捷和经济的选择。如果您需要在您的Qt应用程序中添加音频波形显示功能,不妨考虑使用QWave控件。您可以到QWave项目官网或github等开源代码库中下载最新的QWave源代码和使用文档。谢谢。 ### 回答2: Qt是一种跨平台的C++框架,它提供了许多常用的控件和功能,方便开发人员进行桌面应用程序的开发。其中,qwave是一款Qt音频波形显示控件,它可以实现对音频波形进行可视化展示。 该控件可以直接从Qt官网上的软件中心进行下载和安装,也可以在GitHub等代码托管平台上找到相关的开源库进行下载和使用。使用qwave控件可以方便地实现对音频文件的读取和展示,同时还可以实现波形颜色、粗细、放大缩小等操作。 在使用qwave控件之前,需要先进行安装和集成。安装和集成的过程可以参考官方文档和教程,具体步骤包括下载安装包、解压、编译等。安装完成后,在Qt的项目文件中添加qwave的头文件和库文件,即可在程序中调用该控件。 除了qwave,还有其他一些类似控件,如Qt音频可视化插件QwtAudio。这些控件都可以方便地进行音频波形展示、分析和处理,加快开发人员的开发效率。 ### 回答3: qwave是一个基于Qt框架的音频波形显示控件,适合于QT开发者用于自己的音频软件项目中,它可以实现音频波形的显示、放大、缩小、移动等操作。通过将qwave控件添加到项目中,开发者可以快速方便地实现音频波形的可视化。 如果需要下载qwave控件,可以通过GitHub源码库访问qwave控件的下载链接。在GitHub官网上搜索“qwave”,即可找到开源代码和下载链接。此外,还可以直接在Qt Creator中安装qwave控件,方法是在项目的.pro文件中添加一行代码:“QT += qwave”,Qt Creator将自动引用库文件。 在使用qwave控件时,需要注意一些问题。首先,需要熟悉Qt框架的基本概念和部件组件,以便能够正确地安装、运行和使用qwave控件。其次,需要针对具体的音频软件项目,进行一些修饰和调整,满足项目需求。最后,需要对使用qwave控件的代码进行测试,确保其稳定性和可靠性,减少项目出错的风险。 总之,qwave是一个强大的音频波形显示控件,使用方便,可以在很多项目中帮助开发者实现音频波形的可视化。下载和使用qwave控件需要一定的技术基础和对Qt框架的了解,开发者可以通过学习和实践,逐渐掌握其使用技巧和技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值