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

话不多说上例子:

qt录音器的实例,很简单的例子_第1张图片

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

先看布局吧:

qt录音器的实例,很简单的例子_第2张图片 

就是这莫简单的:

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

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

你可能感兴趣的:(QT5.9)