Qt6.8 使用QAudioBufferInput 录制网络PCM语音流成文件

1 相关参数

PCM 音频参数: 8K 16位 单声道

Qt版本:6.8及以上

录制的文件: wave格式

2 使用到的Qt类

缓存输入类:QAudioBufferInput (QAudioBufferInput 仅支持 FFmpeg 后端。)

桥接器:QMediaCaptureSession

录制器:QMediaRecorder

声音缓存类: QAudioBuffer

这些类的详细资料可以在这里查看:https://doc.qt.io/qt-6/zh/qaudiobufferinput.html

3 初始化各种类

cpp 复制代码
    QMediaRecorder  *m_audioRecorder=nullptr; //录音器(最终写文件)
    
    QAudioBufferInput *audioBufferInput;//语音数据输入缓存

    QMediaCaptureSession *m_captureSession;

    QAudioFormat outputAudioFormat;
cpp 复制代码
    outputAudioFormat.setSampleRate(8000); //设置采样率以对赫兹采样。 以秒为单位,每秒采集多少声音数据的频率.
    outputAudioFormat.setChannelCount(1);   //将通道数设置为通道。
    outputAudioFormat.setSampleFormat(QAudioFormat::Int16);

    RecordStarted=false;

    m_captureSession=new QMediaCaptureSession();
    m_audioRecorder= new QMediaRecorder(); //创建录音器
    m_captureSession->setRecorder(m_audioRecorder); // 桥接录制器

    audioBufferInput =new QAudioBufferInput();//创建声音输入缓存

    m_captureSession->setAudioBufferInput(audioBufferInput);  // 桥接音频输入缓存

4 开始录音

cpp 复制代码
            //设置输出文件
            m_audioRecorder->setOutputLocation(QUrl::fromLocalFile(QString::fromStdString(recordFilePath)));
 
            QMediaFormat format;
            format.setFileFormat(QMediaFormat::FileFormat::Wave );
            format.setAudioCodec(QMediaFormat::AudioCodec::Wave );
            m_audioRecorder->setMediaFormat(format);

            m_audioRecorder->setAudioSampleRate(8000);
            m_audioRecorder->setAudioChannelCount(1);
            m_audioRecorder->setAudioBitRate(96000);
            m_audioRecorder->setQuality(QMediaRecorder::Quality::NormalQuality);
            m_audioRecorder->setEncodingMode(QMediaRecorder::ConstantBitRateEncoding);

            m_audioRecorder->record(); //开始录音
            qDebug()<<"+++录音开始+++";

5 写入网络PCM数据

cpp 复制代码
   QAudioBuffer audioBuffer =QAudioBuffer(Chunk,outputAudioFormat);

    bool ret= audioBufferInput->sendAudioBuffer(audioBuffer);
    //qDebug() <<ret;

6 停止录音

cpp 复制代码
        qDebug() <<"+++停止录音+++" ;
        m_audioRecorder->stop();
相关推荐
Lucas_coding19 天前
【语音相关】Opus编码器生命周期管理:从“有噪音“到“无噪音“的完美转换 [opus, pcm 转化电流音问题解决]
macos·xcode·pcm
Android系统攻城狮19 天前
Android tinyalsa深度解析之pcm_params_get_periods_min调用流程与实战(一百七十三)
android·pcm·tinyalsa·音频进阶手册
@insist12320 天前
网络工程师-信道容量计算与 PCM 编码:数据通信核心原理及软考考点解析
网络·网络工程师·pcm·软考·软件水平考试
Android系统攻城狮21 天前
Android tinyalsa深度解析之pcm_plugin_open调用流程与实战(一百七十四)
android·pcm·tinyalsa·音频进阶手册
Android系统攻城狮21 天前
Android tinyalsa深度解析之pcm_params_set_max调用流程与实战(一百七十)
android·pcm·tinyalsa·android音频进阶
Android系统攻城狮21 天前
Android tinyalsa深度解析之pcm_params_get_period_size_max调用流程与实战(一百七十二)
android·pcm·tinyalsa·音频进阶
Android系统攻城狮21 天前
Android tinyalsa深度解析之pcm_params_set_min调用流程与实战(一百六十九)
android·pcm·tinyalsa·音频进阶
枳实-叶1 个月前
嵌入式 Linux 下 ALSA 音频采集与 PCM 播放流程详解
linux·音视频·pcm
Android系统攻城狮1 个月前
Android tinyalsa深度解析之pcm_params_get调用流程与实战(一百六十二)
android·pcm·tinyalsa·android hal·audio hal