Qt6.8 使用QAudioSink 播放网络PCM语音

1 用到的Qt类

音频输出接口类:QAudioSink

音频设备类:QAudioDevice

相关资料:https://doc.qt.io/qt-6/zh/qaudiosink.html

2 初始化扬声器

cpp 复制代码
QIODevice *m_output;//扬声器播放对象

 QAudioFormat outputAudioFormat;

 QScopedPointer<QAudioSink> audioOutputsource;
cpp 复制代码
//初始化扬声器
void Module_Sound::AudioInOut::initializeOutPutAudio(const QAudioDevice &deviceInfo)
{

    qDebug() << "outputAudioDevice音频输出设备:" << deviceInfo.description();

    outputAudioFormat = deviceInfo.preferredFormat();

    outputAudioFormat.setSampleRate(8000); //设置采样率以对赫兹采样。 以秒为单位,每秒采集多少声音数据的频率.
    outputAudioFormat.setChannelCount(1);   //将通道数设置为通道。
    // outputAudioFormat.setSampleSize(16);     /*将样本大小设置为指定的sampleSize(以位为单位)通常为8或16,但是某些系统可能支持更大的样本量。*/
    outputAudioFormat.setSampleFormat(QAudioFormat::Int16);

    // if(!deviceInfo.isFormatSupported(outputAudioFormat))
    // {
    //     qWarning() << "not Support fromat";
    // }

    qDebug("sampleRate: %d, channelCount: %d, sampleFormat: %d",
           outputAudioFormat.sampleRate(), outputAudioFormat.channelCount(), outputAudioFormat.sampleFormat()
           );
    audioOutputsource.reset(new QAudioSink(deviceInfo, outputAudioFormat));
    audioOutputsource->setBufferSize(300 * outputAudioFormat.bytesPerFrame() * outputAudioFormat.sampleRate() / 1000);
    audioOutputsource->setVolume(1);//最大音量
}

3 开始播放

cpp 复制代码
//开始播放
void Module_Sound::AudioInOut::startAudioOutput()
{
    qDebug() << "onstartListening";
    m_output = audioOutputsource->start();
}

4 写入网络PCM数据

cpp 复制代码
//语音数据写入播放缓存
void Module_Sound::AudioInOut::SoundPlay(int PalyIndex, QByteArray VoiceDataX)
{
    m_output->write(VoiceDataX );
}

5 停止播放

cpp 复制代码
//停止播放
void Module_Sound::AudioInOut::stopAudioOutput()
{
    qDebug() << "onstopListening";
    audioOutputsource->stop();
}
相关推荐
mftang3 小时前
MCU上应用的主流NVM技术: 嵌入式相变存储器(PCM) 和嵌入式磁阻随机存取存储器(MRAM)
单片机·嵌入式硬件·pcm
proware16 天前
3588 ES8388 PCM之需求分析
pcm·3588·es8388
Android系统攻城狮19 天前
Android tinyalsa深度解析之pcm_format_to_bits调用流程与实战(一百二十三)
android·pcm·tinyalsa·音频进阶·音频性能实战
Android系统攻城狮19 天前
Android tinyalsa深度解析之pcm_set_avail_min调用流程与实战(一百二十二)
android·pcm·tinyalsa·音频进阶·android hal·audio hal
Android系统攻城狮20 天前
Android tinyalsa深度解析之pcm_get_delay调用流程与实战(一百一十九)
android·pcm·tinyalsa·音频进阶·android hal·audio hal
Android系统攻城狮22 天前
Android tinyalsa深度解析之pcm_get_timestamp调用流程与实战(一百一十八)
android·pcm·tinyalsa·android hal·audio hal
Android系统攻城狮24 天前
Android tinyalsa深度解析之pcm_state调用流程与实战(一百一十七)
android·pcm·tinyalsa·音频进阶·音频性能实战
Android系统攻城狮25 天前
Android tinyalsa深度解析之pcm_get_available_min调用流程与实战(一百一十六)
android·pcm·tinyalsa·音频进阶·音频性能实战
Knight_AL1 个月前
如何用 FFmpeg 处理 PCM 音频 & 判断 PCM 文件到底是什么格式
ffmpeg·音视频·pcm