音频概述

音频特性

Qt 多媒体提供了一系列音频类,涵盖了从低到高的不同方法来处理音频输入、输出和加工。

音频实现细节

播放压缩音频

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

有关更多详细信息,请参阅 支持的媒体格式

媒体播放器需要连接到一个 QAudioOutput 对象(或 QML 的 AudioOutput 元素)来播放音频。

以下是使用 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 还支持更复杂的使用案例,如下图捕获或视频录制。

低延迟音效

除了对音频设备进行原始访问外,QSoundEffect 类(以及 SoundEffect QML 类型)还提供了一种更抽象的方式来播放声音。此类允许您指定一个 WAV 格式 文件,在需要时可以以低延迟播放。

您可以调整

低级音频播放和录制

Qt多媒体的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空间音频 模块提供了一套API,用于实现3D空间中的声场。

参考文档

C++类

QAmbientSound

立体声覆盖声音

QAudioBuffer

表示特定格式和采样率的音频样本集合

QAudioDecoder

实现音频解码

QAudioDevice

有关音频设备和它们的功能的信息

QAudioEngine

管理三维声场

QAudioFormat

存储音频流参数信息

QAudioInput

代表音频的输入通道

QAudioListener

定义用户听到的QAudioEngine定义的声场的位置和朝向

QAudioOutput

代表音频输出通道

QAudioRoom

QAudioSink

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

QAudioSource

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

QMediaCaptureSession

允许捕获音频和视频内容

QMediaRecorder

用于编码和录制捕获会话

QSoundEffect

播放低延迟声音效果的方式

QSpatialSound

3D空间中的一个声音对象

QtAudio

包含由音频类使用的枚举

QML类型

AmbientSound

立体声覆盖声音

AudioEngine

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

AudioInput

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

AudioListener

定义通过AudioEngine定义的声音场的听者的位置和朝向

音频输出

用于播放或监控捕获会话的音频输出

音频室

捕获会话

允许捕获音频和视频内容

媒体播放器

向场景添加媒体播放

媒体录制器

用于在捕获会话中生成的媒体编码和录制

声音效果

类型为在QML中播放声音效果提供了一种方式

空间声音

3D空间中的一个声音对象

音频设备

描述一个音频设备

媒体元数据

为媒体文件提供元数据

示例

音频设备示例

测试可用的音频设备和它们的配置。

音频输出示例

使用QAudioSink类启用音频播放。

音频录制器示例

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

音频源示例

使用QAudioSource类录制音频。

空间音频声像示例

显示Qt空间音频引擎的一些能力。

© 2024 Qt公司。本文档的贡献是各自所有者的版权。本文档的提供受免费软件基金会发布的GNU自由文档许可版本1.3条款的约束。Qt及其相应的标志是芬兰的Qt公司及其在全世界各国/地区的商标。所有其他商标均为各自所有者的财产。