目录
对于音频编程的基本概念不熟悉的可以去参考我的另一篇博文:音频的一些基本概念
因为录取到的数据是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(平声道)的声道数目是1;stero(立体声)的声道数目是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