qt录音器的实例,很简单的例子

历届女足世界杯

话不多说上例子:

通过录入后,可以获取我们的声音了,还是非常简单的:

先看布局吧:

就是这莫简单的:

在写多媒体的时候,工程要添加:

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

Copyright © 2088 世界杯女足_足球歌曲世界杯主题曲 - luxiuying.com All Rights Reserved.
友情链接