音频概述

音频功能

Qt Multimedia 提供一系列音频类,涵盖音频输入、输出和处理的低级和高级方法。

音频实现细节

播放压缩音频

要播放非简单、未压缩音频的媒体或音频文件,可使用QMediaPlayer C++ 类或MediaPlayer QML 类型。如果需要,QMediaPlayer 类和相关 QML 类型也能播放视频

更多详情,请参阅支持的媒体格式

媒体播放器需要连接到QAudioOutput 对象(或 QMLAudioOutput 元素)才能播放音频。

以下是使用 C++ 播放本地文件的方法:

player = new QMediaPlayer;
audioOutput = new QAudioOutput;
player->setAudioOutput(audioOutput);
// ...
player->setSource(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3"));
audioOutput->setVolume(50);
player->play();

QML 中的相同功能:

MediaPlayer {
    audioOutput: AudioOutput {}
    source: "file:///path/to/my/music.mp3"
    Component.onCompleted: { play() }
}

将音频录制到文件

要将音频录制到文件,您需要创建一个捕获会话,并连接音频输入和录音机。这些元素通过QMediaCaptureSessionQAudioInputQMediaRecorder 类实现。默认构建的QAudioInput 选择系统默认的音频输入。录音机通过简单的 record() 和 stop() 函数控制录音过程。此外,您还可以用它来选择输出位置、音频编码器或文件容器格式。

在 C++ 中,使用默认麦克风录制音频的会话如下:

QMediaCaptureSession session;
QAudioInput audioInput;
session.setAudioInput(&input);
QMediaRecorder recorder;
session.setRecorder(&recorder);
recorder.setQuality(QMediaRecorder::HighQuality);
recorder.setOutputLocation(QUrl::fromLocalFile("test.mp3"));
recorder.record();

在 QML 中,可以通过以下方式实现同样的效果:

CaptureSession {
    audioInput: AudioInput {}
    mediaRecorder: MediaRecorder {
        id: recorder
        outputLocation: "file:///path/to/test.mp3"
    }
    Component.onCompleted: { recorder.record() }
}

QMediaCaptureSession QML 还支持更复杂的用例,如图像捕捉或视频录制。

低延迟音效

除了对声音设备的原始访问外,QSoundEffect 类(和SoundEffect QML 类型)还提供了一种更抽象的声音播放方式。通过该类,您可以指定WAV 格式文件,然后在必要时以低延迟方式播放。

您可以调整

低电平音频播放和录音

Qt Multimedia 的 C++ API 提供了用于原始访问音频输入和输出设备的类,允许应用程序从麦克风等设备接收原始数据,并将原始数据写入扬声器或其他设备。一般来说,这些类不进行任何音频解码或其他处理,但它们可以支持不同类型的原始音频数据。

QAudioSink 类提供原始音频数据输出,而QAudioSource 则提供原始音频数据输入。可用的硬件决定了哪些音频输出和输入可用。

推和拉

低级音频类可在两种模式下运行--pushpull 。在pull 模式下,音频设备通过给它一个QIODevice 来启动。对于输出设备,当需要更多音频数据时,QAudioSink 类将从QIODevice (使用QIODevice::read() )中提取数据。相反,对于带有QAudioSourcepull 模式,当音频数据可用时,数据将直接写入QIODevice

push 模式下,音频设备提供一个QIODevice 实例,可根据需要写入或读取。通常情况下,这样代码更简单,但缓冲更多,可能会影响延迟。

解码压缩音频到内存

在某些情况下,您可能希望解码压缩音频文件并自行进行进一步处理。例如,混合多个样本或使用自定义数字信号处理算法。QAudioDecoder 支持解码本地文件或来自QIODevice 实例的数据流。

下面是一个解码本地文件的示例:

QAudioFormat desiredFormat;
desiredFormat.setChannelCount(2);
desiredFormat.setSampleFormat(QAudioFormat::Int16);
desiredFormat.setSampleRate(48000);

QAudioDecoder *decoder = new QAudioDecoder(this);
decoder->setAudioFormat(desiredFormat);
decoder->setSource("level1.mp3");

connect(decoder, &QAudioDecoder::bufferReady, this, &AudioDecodingExample::readBuffer);
decoder->start();

// Now wait for bufferReady() signal and call decoder->read()

空间音频

空间音频 Qt Spatial Audio模块提供了在三维空间中执行声场的应用程序接口。

参考文档

C++ 类

QAmbientSound

立体声叠加音频

QAudioBuffer

代表具有特定格式和采样率的音频样本集合

QAudioBufferInput

用于通过 QMediaCaptureSession 向 QMediaRecorder 提供自定义音频缓冲区

QAudioBufferOutput

用于捕获 QMediaPlayer 提供的音频数据

QAudioDecoder

实现音频解码

QAudioDevice

有关音频设备及其功能的信息

QAudioEngine

管理三维声场

QAudioFormat

存储音频流参数信息

QAudioInput

代表音频输入通道

QAudioListener

定义收听 QAudioEngine 所定义声场的人的位置和方向

QAudioOutput

代表音频的输出通道

QAudioRoom

QAudioSink

向音频输出设备发送音频数据的接口

QAudioSource

从音频输入设备接收音频数据的接口

QMediaCaptureSession

允许捕获音频和视频内容

QMediaRecorder

用于编码和录制捕获会话

QSoundEffect

播放低延迟音效的方式

QSpatialSound

三维空间中的声音对象

QtAudio

包含音频类使用的枚举

QML 类型

AmbientSound

立体声覆盖声音

AudioEngine

管理 3D 场景内的声音对象

AudioInput

在捕获会话中用于捕获音频的音频输入

AudioListener

定义聆听音频引擎所定义声场的人的位置和方向

AudioOutput

音频输出,用于回放或监控捕捉会话

AudioRoom

CaptureSession

允许捕捉音频和视频内容

MediaPlayer

为场景添加媒体回放

MediaRecorder

用于编码和记录捕捉会话中生成的媒体

SoundEffect

该类型提供了一种在 QML 中播放音效的方法

SpatialSound

三维空间中的声音对象

audioDevice

描述音频设备

mediaMetaData

为媒体文件提供元数据

实例

Audio Devices Example

测试可用音频设备及其配置

Audio Output Example

使用 QAudioSink 类启用音频播放。

Audio Recorder Example

发现可用设备和支持的编解码器。

Audio Source Example

使用 QAudioSource 类录制音频。

Spatial Audio Panning Example

展示 Qt Spatial Audio 引擎的部分功能

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.