QT进行音频录制

文章目录

QT使用AudioRecorder进行 音频录制

使用Qt框架的AudioRecorder类进行音频录制,可以通过Qt的MultimediaWidgets模块实现。

  1. 首先,确保你的Qt项目中包含了MultimediaWidgets模块 ‌。这通常在项目的.pro文件中进行配置,通过添加QT += MultimediaWidgets来启用MultimediaWidgets模块。
  2. 创建一个Qt Widgets应用程序‌,并添加必要的类和方法来处理视频录制。这包括创建一个主窗口类(Widget),并在其中添加音频录制开始,暂停,停止等功能。
  3. 设置音频编码器设置 ‌:使用QAudioEncoderSettings类来进行音频编码器设置。
  4. 音频录制 ‌:使用QAudioRecorder类来录制音频。配置好录制的参数后,使用QAudioRecorder::record()方法可以开始录制。录制完成后,可以通过QAudioRecorder::stop()方法来停止录制。
  5. 处理事件‌:为你的主窗口添加事件处理函数,如开始录制和停止录制的按钮点击事件,以及处理录制的开始和结束等。

首先,确保你的项目文件.pro包含多媒体模块:

c++ 复制代码
 QT       += core gui multimedia multimediawidgets

然后,在Qt应用程序中,创建 Widget 类:

  • C++头文件 "widget.h" 内容如下:
C++ 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QAudioRecorder>
#include <QPushButton>
#include <QComboBox>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLineEdit>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_start_clicked();
    void on_stop_clicked();
    void on_select_clicked();
    void updateProgress(qint64 duration);

private:
    QLabel      *labelState;
    QLabel      *label0;
    QLabel      *label1;
    QLabel      *label2;
    QLineEdit   *lineEditFileName;
    QPushButton *pbStop;
    QPushButton *pbStart;
    QPushButton *pbSelect;
    QComboBox   *comboBoxSelect;
    QAudioRecorder *audioRecorder;
};
#endif // WIDGET_H
  • C++源文件 widget.cpp 内容如下:
C++ 复制代码
#include "widget.h"
#include "QUrl"
#include <QFileDialog>
#include <QGridLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    label0 = new QLabel(tr("状态"));
    labelState = new QLabel;
    labelState->setFrameStyle(QFrame::Box);

    label1 = new QLabel(tr("输入设备"));
    audioRecorder = new QAudioRecorder;
    QStringList inputs = audioRecorder->audioInputs();
    comboBoxSelect = new QComboBox;
    comboBoxSelect->addItems(inputs);

    label2 = new QLabel(tr("保存地址"));
    lineEditFileName = new QLineEdit;

    pbStop = new QPushButton(tr("停止"));
    pbStart = new QPushButton(tr("开始"));
    pbSelect = new QPushButton(tr("选择"));

    QAudioEncoderSettings audioSettings;
    audioSettings.setCodec("audio/pcm");
    audioSettings.setQuality(QMultimedia::HighQuality);
    audioRecorder->setAudioSettings(audioSettings);

    QGridLayout *layoutMain = new QGridLayout(this);
    layoutMain->setMargin(20);
    layoutMain->setSpacing(10);
    layoutMain->addWidget(label0,0,0);
    layoutMain->addWidget(labelState,0,1,1,3);
    layoutMain->addWidget(label1,1,0);
    layoutMain->addWidget(comboBoxSelect,1,1,1,3);
    layoutMain->addWidget(label2,2,0);
    layoutMain->addWidget(lineEditFileName,2,1,1,2);
    layoutMain->addWidget(pbSelect,2,3);
    layoutMain->addWidget(pbStart,3,1);
    layoutMain->addWidget(pbStop,3,2);
    resize(480,190);
    setWindowTitle(tr("录音机"));

    connect(pbStop, &QPushButton::clicked, this,
            &Widget::on_stop_clicked);
    connect(pbStart, &QPushButton::clicked, this,
            &Widget::on_start_clicked);
    connect(pbSelect, &QPushButton::clicked, this,
            &Widget::on_select_clicked);
    connect(audioRecorder, &QAudioRecorder::durationChanged, this,
            &Widget::updateProgress);

}


void Widget::on_start_clicked()
{
    if(lineEditFileName->text().isEmpty()) {
        return;
    }
    audioRecorder->setAudioInput(comboBoxSelect->currentText());
    audioRecorder->setOutputLocation(QUrl::fromLocalFile(lineEditFileName->text()));
    audioRecorder->record();
}
void Widget::on_stop_clicked()
{
    audioRecorder->stop();
}
void Widget::on_select_clicked()
{
    QString fileName = QFileDialog::getSaveFileName();
    lineEditFileName->setText(fileName);
}
void Widget::updateProgress(qint64 duration)
{
    if (audioRecorder->error() != QMediaRecorder::NoError || duration < 1000)
        return;
    labelState->setText(tr("Recorded %1 sec").arg(duration / 1000));
}

Widget::~Widget()
{
}
  • 主程序main.cpp 内容如下
C++ 复制代码
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

小结

​ 这段代码演示了如何使用QT的QAudioRecorder类进行音频录制。首先,创建了一个QAudioRecorder对象并设置了音频输入设备、输出位置和输出格式。然后,通过调用record()方法开始录制,通过调用stop()方法停止录制。最后,不要忘记清理资源。。

相关推荐
小坏坏的大世界1 小时前
C++ STL常用容器总结(vector, deque, list, map, set)
c++·算法
liulilittle2 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
励志要当大牛的小白菜4 小时前
ART配对软件使用
开发语言·c++·qt·算法
PAK向日葵5 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
源码_V_saaskw7 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
QQ_4376643149 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
liulilittle11 小时前
C++/CLI与标准C++的语法差异(一)
开发语言·c++·.net·cli·clr·托管·原生
小狄同学呀11 小时前
VS插件报错,g++却完美编译?API调用错因分析
c++
程序员编程指南11 小时前
Qt 数据库连接池实现与管理
c语言·数据库·c++·qt·oracle
小乖兽技术11 小时前
C#与C++交互开发系列(二十四):WinForms 应用中嵌入C++ 原生窗体
c++·c#·交互