• Qt中音频的使用


    对于音频我们在使用的过程中一般是录制音频、播放音频。针对这两个需求介绍Qt中音频的使用。

    Qt中音频的录制

    步骤:

    1、获取系统中的音频设备。

    2、创建QAudioRecorder对象,指定使用的音频设备,通过QAudioRecorder的setAudioInput函数设置。

    3、设置音频的保存位置,通过QAudioRecorder对象的setOutputLocation函数设置。

    4、设置保存的音频格式,通过QAudioRecorder对象的setAudioSettings函数设置,设置参数为QAudioEncoderSettings。

    5、设置保存音频的容器格式,通过QAudioRecorder对象的setContainerFormat。

    6、以上参数设置完成之后就可以QAudioRecorder对象调用record开始录制了,如果不设置相关才是,会使用系统默认的参数。

    7、AudioRecorder对象调用stop()结束录制。

    8、AudioRecorder对象调用pause()暂停录制。

    代码如下:

    QList  audioDevices  = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);//获取音频的输入设备
    foreach (QAudioDeviceInfo device, audioDevices) {
        ui->comboBox_sound->addItem(device.deviceName());
    }
    ......
    m_audioRecorder = new QAudioRecorder(this);
    QString datatime = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss");
    m_audioName = QString("%2/audio/%3").arg(savePath).arg(datatime);
    m_audioRecorder->setOutputLocation(QUrl::fromLocalFile(m_audioName));
    m_audioRecorder->setAudioInput(audioDeviceName);
    QAudioEncoderSettings set;
    
    set.setCodec("audio/wav");   // 这些是QAudioRecorder是设置,见名思意
    set.setQuality(QMultimedia::EncodingQuality::HighQuality);
    set.setEncodingMode(QMultimedia::ConstantQualityEncoding);
    
    m_audioRecorder->setContainerFormat("audio/wav");  // 设置容器格式
    m_audioRecorder->setAudioSettings(set);
    m_audioRecorder->record();//开始录制
    ......
    m_audioRecorder->pause();//暂停录制
    ......
    m_audioRecorder->stop();//结束录制
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    以上可以完成最基本的音频录制,但是如果想使用更高端的录制,例如在录制的时候显示音频的想干信息。要想实现以上描述,需要使用Qt提供的QAudioProbe类来监控音频数据。

    实现步骤如下:

    1、创建QAudioProbe对象。

    2、QAudioProbe对象通过调用setSource函数设置监控对象,传入参数为AudioRecorder对象。这里QAudioProbe对象监控的就是AudioRecorder对象对象输入的音频。

    3、实现QAudioProbe::audioBufferProbed信号槽函数,这个信号是当在媒体服务中处理音频缓冲器时发出该。信号会传递一个QAudioBuffer 格式的音频数据。

    4、实现槽函数接收QAudioBuffer 类型的数据,之后通过对接收到数据的计算实现频谱或者其他的显示。

    代码如下:

        m_audioRecordProbe = new QAudioProbe(this);
        m_audioRecorder = new QAudioRecorder(this);
    
        //显示
        m_audioRecordProbe->setSource(m_audioRecorder);  // 指定声源
    
        connect(m_audioProbe, &QAudioProbe::audioBufferProbed, this,[=](const QAudioBuffer &buffer){
            emit audioProcessBuff(buffer);
        });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Qt中音频的播放

    步骤:

    1、创建一个QMediaPlayer对象。

    2、创建QMediaPlaylist对象。

    3、通过QMediaPlaylist对象的setPlaybackMode函数创建列表的循环模式。

    ConstantValueDescription
    QMediaPlaylist::CurrentItemOnce0当前项目只播放一次。
    QMediaPlaylist::CurrentItemInLoop1当前项目在循环中重复播放
    QMediaPlaylist::Sequential2播放从当前开始,在每个连续项目中移动,直到到达最后一个项目,然后停止。当前正在播放上一个项目时,下一个项目为空项目。
    QMediaPlaylist::Loop3播放在最后一个项目播放完毕后的第一个项目处重新开始。
    QMediaPlaylist::Random4按随机顺序播放项目

    4、 QMediaPlayer对象通过函数setPlaylist设置播放列表,参数为QMediaPlaylist对象。

    5、向播放列表中添加需要播放的音频,通过QMediaPlaylist对象addMedia函数添加音频列表。

    6、在音频列表中选择需要播放的音频,使用QMediaPlaylist对象的setCurrentIndex函数,参数为音频标号。

    7、QMediaPlayer对象调用play函数播放音频。

    8、QMediaPlayer对象调用pause函数暂停播放音频。

    9、QMediaPlayer对象调用stop函数停止播放音频。

    代码如下:

    m_mediaPlayer = new QMediaPlayer(this);
    m_mediaPlaylist = new QMediaPlaylist(this);
    m_mediaPlaylist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
    m_mediaPlayer->setPlaylist(m_mediaPlaylist);
    ......
    m_mediaPlaylist->addMedia(QUrl::fromLocalFile(filePath));
    ......
    m_mediaPlaylist->setCurrentIndex(index);
    ......
    m_mediaPlayer->play();
    ......
    m_mediaPlayer->pause();
    ......
    m_mediaPlayer->stop();
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    QMediaPlayer除了播放、暂停、停止播放外,还有其他设置,例如设置声音大小,快进、快退等。都可以通过QMediaPlayer对象的函数进行设置。也可以通过QAudioProbe对象对播放的音频进行监听,实现播放音频声波的可视化。方法和录制一样。

    通过QSound类播放音频:暂不介绍

  • 相关阅读:
    19.服务器端会话技术Session
    Google guava之Multiset简介说明
    【牛客刷题-SQL大厂面试真题】NO5.某宝店铺分析(电商模式)
    漏洞复现--迪普DPTech VPN 任意文件读取
    设计模式 - 模板模式
    使用 uni-app 开发app时 中使用的 @longpress 含义及使用方法
    Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
    Android Button点击事件
    SpringBoot整合EasyExcel
    3.6 Android gpu_mem ebpf程序设计原理(二)
  • 原文地址:https://blog.csdn.net/qq_43812868/article/details/132869459