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

比眉伴天荒 2022-12-20 12:36 433阅读 0赞

目录

  • 1、创建一个qt工程
  • 2、添加所需头文件
  • 3、相关函数
    • 3.1.设置字节顺序
    • 3.2.设置通道数
    • 3.3.设置编码器
    • 3.4.设置采样频率
    • 3.5.设置样本长度
    • 3.6.样本数据类型
  • 4、示例代码
    • `mainwindow.h`
    • `mainwindow.cpp`
      • `main.cpp`
  • 5、运行结果

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

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

1、创建一个qt工程

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

2、添加所需头文件

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

  1. 录入音频数据所需的头文件
  2. #include <QAudioInput>
  3. 输出音频数据进行播放所需的头文件
  4. #include <QAudioOutput>
  5. 设置音频对象格式所需的头文件
  6. #include <QAudioFormat>

3、相关函数

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

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

3.1.设置字节顺序

  1. 字节序分为LittleEndian(低位优先)/LargeEndian(高位优先)
  2. 注意:需要录音与播放的字节序必须一致
  3. setByteOrder(QAudioFormat::LittleEndian);//设置端字节序:小端字节序

3.2.设置通道数

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

3.3.设置编码器

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

3.4.设置采样频率

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

3.5.设置样本长度

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

3.6.样本数据类型

  1. 采样数据类型有:
  2. QAudioFormat::SignedInt //样本数据是符号整型
  3. QAudioFormat::UnSignedInt //样本数据是无符号整型
  4. QAudioFormat::Float //样本数据是浮点型
  5. 根据采样的数据选择对应的类型
  6. setSampleType(QAudioFormat::UnSignedInt);//存储样本数据类型:UnSigned Int

4、示例代码

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

mainwindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QAudioInput> //音频录入头文件
  5. #include <QAudioOutput> //音频输出头文件
  6. #include <QFile>
  7. QT_BEGIN_NAMESPACE
  8. namespace Ui { class MainWindow; }
  9. QT_END_NAMESPACE
  10. class MainWindow : public QMainWindow
  11. {
  12. Q_OBJECT
  13. public:
  14. MainWindow(QWidget *parent = nullptr);
  15. ~MainWindow();
  16. protected slots:
  17. void changed(QAudio::State state); //状态改变时的槽函数
  18. private slots:
  19. void on_pushButton_clicked(); //录音
  20. void on_pushButton_2_clicked(); //停止录音
  21. void on_pushButton_3_clicked(); //获取文件路径
  22. void on_pushButton_4_clicked(); //播放音频
  23. private:
  24. Ui::MainWindow *ui;
  25. QAudioInput *input; //录音的操作对象
  26. QAudioOutput *output; //播放音频的操作对象
  27. QFile SaveFile; //用于每次打开保存的文件路径
  28. QFile OpenFile; //打开播放的文件路径
  29. };
  30. #endif // MAINWINDOW_H

mainwindow.cpp

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QtDebug>
  4. #include <QFileDialog>
  5. MainWindow::MainWindow(QWidget *parent)
  6. : QMainWindow(parent)
  7. , ui(new Ui::MainWindow)
  8. {
  9. ui->setupUi(this);
  10. //用于初始化
  11. QAudioFormat format;
  12. format.setSampleRate(44100);//采样率
  13. format.setChannelCount(2);//通道
  14. format.setSampleSize(16);//样本长度
  15. format.setByteOrder(QAudioFormat::LittleEndian);//设置端字节序:小端序
  16. format.setSampleType(QAudioFormat::UnSignedInt);//存储样本数据类型
  17. format.setCodec("audio/pcm");//这个用来设置编码器为audio/pcm,该编码器为所有平台支持
  18. //监测当前设置是否支持format设置的格式
  19. QAudioDeviceInfo infodev = QAudioDeviceInfo::defaultInputDevice();
  20. if(!infodev.isFormatSupported(format))
  21. { //不支持打印一下
  22. qDebug()<<"format";
  23. }
  24. //设置录音对象的格式
  25. input = new QAudioInput(format,this);
  26. //设置播放音频对象格式,关联状态槽函数,当状态改变后将触发该槽函数
  27. /* 当播放音频时,状态改变就会发出一个stateChanged信号,一共有五种状态 enum State { ActiveState, //运行状态 SuspendedState, // 挂起状态 StoppedState, //停止状态 IdleState, //空闲状态 InterruptedState //中断状态 }; */
  28. output = new QAudioOutput(format,this);
  29. connect(output,&QAudioOutput::stateChanged,this,&MainWindow::changed);
  30. }
  31. MainWindow::~MainWindow()
  32. {
  33. delete ui;
  34. }
  35. //点击开始录音
  36. void MainWindow::on_pushButton_clicked()
  37. {
  38. QString name = ui->lineEdit_2->text();//获取保存的文件名,默认路径在当前目录
  39. if(name.isEmpty())
  40. {
  41. name="my.raw";
  42. }
  43. OpenFile.setFileName(name);
  44. OpenFile.open(QIODevice::ReadWrite);
  45. qDebug()<<name;
  46. //开始录音并且给一个文件路径
  47. input->start(&OpenFile);
  48. }
  49. //点击停止录音
  50. void MainWindow::on_pushButton_2_clicked()
  51. {
  52. //停止录音,关闭文件,不关闭数据不会真正写入文件
  53. input->stop();
  54. OpenFile.close();
  55. }
  56. //获取文件路径
  57. void MainWindow::on_pushButton_3_clicked()
  58. {
  59. QString fileName = QFileDialog::getOpenFileName();//弹出文件对话框获取文件路径与名称
  60. ui->lineEdit->setText(fileName);
  61. }
  62. //播放音频
  63. void MainWindow::on_pushButton_4_clicked()
  64. {
  65. QString name = ui->lineEdit->text();
  66. SaveFile.setFileName(name);
  67. SaveFile.open(QFileDevice::ReadOnly); //打开音频文件只读
  68. output->start(&SaveFile);
  69. }
  70. //当播放音频完毕后响应的槽函数
  71. void MainWindow::changed(QAudio::State state)
  72. {
  73. if(state == QAudio::IdleState)
  74. {
  75. SaveFile.close();
  76. }
  77. }

main.cpp

  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. MainWindow w;
  7. w.show();
  8. return a.exec();
  9. }

5、运行结果

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

发表评论

表情:
评论列表 (有 0 条评论,433人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Qt学习入门

    Qt支持的平台包括Windows、Mac、Linux等桌面操作系统,QNX、VxWorks、Embedded Linux等嵌入式平台,还包括Android、iOS、WP/Win

    相关 QT入门学习2

    QT获取窗口几何布局有2类函数:   1、包含框架:x()、y()、frameGemetry()、pos()、move()... 2、不包含框架:geometry()、wi