当前位置: 首页 > article >正文

QT进行音频录制

文章目录

  • QT使用`AudioRecorder`进行 音频录制
    • 首先,确保你的项目文件`.pro`包含多媒体模块:
    • 然后,在Qt应用程序中,创建 Widget 类:
    • 小结

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包含多媒体模块:

 QT       += core gui multimedia multimediawidgets

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

  • C++头文件 “widget.h” 内容如下:
#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 内容如下:
#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 内容如下
#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()方法停止录制。最后,不要忘记清理资源。。


http://www.kler.cn/a/301683.html

相关文章:

  • Ubuntu22.04LTS 部署前后端分离项目
  • 【Node.js】使用 Node.js 需要了解多少 JavaScript?
  • 什么是SSL VPN?其中的协议结构是怎样的?
  • 开源共建 | 长安链开发常见问题及规避
  • mybatis-plus: mapper-locations: “classpath*:/mapper/**/*.xml“配置!!!解释
  • rk3399开发环境使用Android 10初体验蓝牙功能
  • elementUI中el-form 嵌套el-from 如何进行表单校验?
  • 【C++ 智能指针】RAII和四种智能指针你理解吗?
  • Python学习笔记--类型、运算符、循环
  • 物联网之PWM呼吸灯、脉冲、LEDC
  • 【Linux】 LTG:移动硬盘部署Ubuntu24.04
  • vue 父组件给子组件传值
  • 基于深度学习的创新设计的生成AI
  • 哪一种反爬虫策略更加人性化,不让用户感知到
  • 02.06、回文链表
  • 离散制造与流程制造的差异分析
  • 熟悉Kafka组成模块、Kafka消息提交的方式及优缺点
  • 在js中观察者模式讲解
  • cross-plateform 跨平台应用程序-02-有哪些主流技术栈?
  • 123.rk3399 uboot(2017.09) 源码分析3(2024-09-12)
  • CSS中的位置定位总结
  • 《2024中国数据要素产业图谱2.0版》重磅发布
  • Java将Word文档转换为PDF文件常用方法总结
  • Android 系统下:普通应用无缝安装,Launcher 应用安装遭遇罕见障碍解析
  • route-forward springboot实现路由转发程序
  • 【C++开发中XML 文件的妙用】