话不多说上例子:
通过录入后,可以获取我们的声音了,还是非常简单的:
先看布局吧:
就是这莫简单的:
在写多媒体的时候,工程要添加:
QT += multimedia
添加后,我们在对应头文件中添加:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QAudioRecorder *recorder; //音频录音
QAudioProbe *probe; //探测器
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
//自定义槽函数
void onStateChanged(QMediaRecorder::State state);//recorder
void onDurationChanged(qint64 duration);//recorder
void processBuffer(const QAudioBuffer& buffer);//probe
void on_actRecord_triggered();
void on_actPause_triggered();
void on_actStop_triggered();
void on_btnGetFile_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
函数初始化:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
recorder = new QAudioRecorder(this);
probe = new QAudioProbe; //探测器
connect(probe,&QAudioProbe::audioBufferProbed,
this,&MainWindow::processBuffer); //关联函数
probe->setSource(recorder);
connect(recorder,&QAudioRecorder::stateChanged,
this,&MainWindow::onStateChanged);
connect(recorder,&QAudioRecorder::durationChanged,
this,&MainWindow::onDurationChanged);
if(recorder->defaultAudioInput().isEmpty())
{
return; //无音频录入设备
}
foreach(const QString &device,recorder->audioInputs())
{
ui->comboDevices->addItem(device); //音频录音设备
}
foreach(const QString &codeName, recorder->supportedAudioCodecs())
{
ui->comboCodec->addItem(codeName); //支持的音频编码
}
foreach(int sampleRate,recorder->supportedAudioSampleRates())
{
ui->comboSampleRate->addItem(QString::number(sampleRate)); //支持的采样率
}
//channels
ui->comboChannels->addItem("1");
ui->comboChannels->addItem("2");
ui->comboChannels->addItem("4");
//quality
ui->sliderQuality->setRange(0,int(QMultimedia::VeryHighQuality)); //范围是0 到最好
ui->sliderQuality->setValue(int(QMultimedia::NormalQuality)); //选择正常的录音
//bitrates:
ui->comboBitrate->addItem("32000");
ui->comboBitrate->addItem("64000");
ui->comboBitrate->addItem("96000");
ui->comboBitrate->addItem("128000");
}
QAudioRecorder 类型变量 recorder 用 于录音, QAudioProb巳 类型变量 probe 用于探测缓冲区数据。
槽函数 onStateChanged()与 recorder 的 stateChanged()信号关联 , 在 recorder 的状态变化时控制界面上“录音”“暂停”“停止” 等按钮的使能状态 。
void MainWindow::onStateChanged(QMediaRecorder::State state)
{
//录音状态变化
ui->actRecord->setEnabled(state!=QMediaRecorder::RecordingState);
ui->actPause->setEnabled(state == QMediaRecorder::RecordingState);
ui->actStop->setEnabled(state==QMediaRecorder::RecordingState);
ui->btnGetFile->setEnabled(state==QMediaRecorder::StoppedState);
ui->editOutputFile->setEnabled(state==QMediaRecorder::StoppedState);
}
void MainWindow::onDurationChanged(qint64 duration)
{
//录音持续时间变化
ui->LabPassTime->setText(QString("已录制 %1 秒").arg(duration / 1000));
}
槽函数 processBuffer() 与 probe 的 信号 audioBufferProbed() 关联 ,这个信号会传递 一 个QAudioBuffer 类型的变量 ,这个变量里存储了缓冲区的信息和音频原始数据 。
void MainWindow::processBuffer(const QAudioBuffer &buffer)
{
//处理探测到的缓冲区
ui->spin_byteCount->setValue(buffer.byteCount());//缓冲区字节数
ui->spin_duration->setValue(buffer.duration()/1000);//缓冲区时长
ui->spin_frameCount->setValue(buffer.frameCount());//缓冲区帧数
ui->spin_sampleCount->setValue(buffer.sampleCount());//缓冲区采样数
QAudioFormat audioFormat=buffer.format();//缓冲区格式
ui->spin_channelCount->setValue(audioFormat.channelCount()); //通道数
ui->spin_sampleSize->setValue(audioFormat.sampleSize());//采样大小
ui->spin_sampleRate->setValue(audioFormat.sampleRate());//采样率
ui->spin_bytesPerFrame->setValue(audioFormat.bytesPerFrame());//每帧字节数
if (audioFormat.byteOrder()==QAudioFormat::LittleEndian)
ui->edit_byteOrder->setText("LittleEndian");//字节序
else
ui->edit_byteOrder->setText("BigEndian");
ui->edit_codec->setText(audioFormat.codec());//编码格式
if (audioFormat.sampleType()==QAudioFormat::SignedInt)//采样点类型
ui->edit_sampleType->setText("SignedInt");
else if(audioFormat.sampleType()==QAudioFormat::UnSignedInt)
ui->edit_sampleType->setText("UnSignedInt");
else if(audioFormat.sampleType()==QAudioFormat::Float)
ui->edit_sampleType->setText("Float");
else
ui->edit_sampleType->setText("Unknown");
}
选择一个录音输出文件后,就可以通过界面上“录音” “暂停”“停止” 三个按钮进行录音控制, 三个按钮代码如下:
void MainWindow::on_actRecord_triggered()
{
//开始录音
if(recorder->state() == QMediaRecorder::StoppedState) //已停止,从新设置
{
QString selectedFile = ui->editOutputFile->text().trimmed();
if(selectedFile.isEmpty())
{
QMessageBox::critical(this,"错误","所设置录音输出文件被占用,无法删除");
return;
}
if(QFile::exists(selectedFile))
{
if(!QFile::remove(selectedFile))
{
QMessageBox::critical(this,"错误","所设置录音输出文件被占用,无法删除");
return;
}
}
recorder->setOutputLocation(QUrl::fromLocalFile(selectedFile));//设置输出文件
recorder->setAudioInput(ui->comboDevices->currentText()); //设置录入设备
QAudioEncoderSettings settings; //音频编码设置
settings.setCodec(ui->comboCodec->currentText()); //编码
settings.setSampleRate(ui->comboSampleRate->currentText().toInt());//采样率
settings.setBitRate(ui->comboBitrate->currentText().toInt());//比特率
settings.setChannelCount(ui->comboChannels->currentText().toInt()); //通道数
settings.setQuality(QMultimedia::EncodingQuality(ui->sliderQuality->value())); //品质
if (ui->radioQuality->isChecked())//编码模式为固定品质,自动决定采样率,采样点大小
settings.setEncodingMode(QMultimedia::ConstantQualityEncoding);
else
settings.setEncodingMode(QMultimedia::ConstantBitRateEncoding);//固定比特率
recorder->setAudioSettings(settings);
}
recorder->record(); //开始记录啦
}
void MainWindow::on_actPause_triggered()
{
//暂停
recorder->pause();
}
void MainWindow::on_actStop_triggered()
{
//停止
recorder->stop();
}
保存文件:
void MainWindow::on_btnGetFile_clicked()
{
//设置保存文件
QString curPath=QDir::homePath();//获取系统当前目录
QString dlgTitle="选择输出文件"; //对话框标题
QString filter="wav文件(*.wav)"; //文件过滤器
QString selectedFile=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter);
if (!selectedFile.isEmpty())
ui->editOutputFile->setText(selectedFile);
}
连接:
链接:https://pan.baidu.com/s/1CrP481SP74iXWPO0kzSPew
提取码:yosk