音频概述

音频特征

Qt Multimedia 提供了涵盖低级/高级途径的一系列音频类:音频输入、输出和处理。

音频实现细节

播放压缩音频

对于播放不简单媒体或音频文件、未压缩音频,可以使用 QMediaPlayer C++ 类,或 MediaPlayer QML 类型。 QMediaPlayer 类和关联 QML 类型还能播放 video ,若有要求。

支持的媒体格式 for more detail.

媒体播放器需要连接到 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() }
}
					

把音频录制到文件

要将音频录制到文件,需要创建捕获会话并把音频输入和录制器连接到它。这些元素的实现是采用 QMediaCaptureSession , QAudioInput ,和 QMediaRecorder 类。默认构造 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 Multimedia 的 C++ API 提供了用于原生访问音频输入和输出设施的类,允许应用程序从像麦克风的设备接收原生数据,并将原生数据写入扬声器或其它设备。这些类一般不做任何音频解码或其它处理,但它们可以支持不同类型的原生音频数据。

The QAudioSink 类提供原生音频数据输出,而 QAudioSource 提供原生音频数据输入。可用硬件确定什么音频输出和输入可用。

压入和拉出

低级音频类可以运转于 2 种模式下 push and pull 。在 pull 模式,音频设备的启动是通过将它赋予 QIODevice 。对于输出设备, QAudioSink 类将 pull (拉出) 数据从 QIODevice (使用 QIODevice::read ()) 当要求更多音频数据时。相反,对于 pull 模式采用 QAudioSource ,当音频数据可用时,数据将被直接写入 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, SIGNAL(bufferReady()), this, SLOT(readBuffer()));
decoder->start();
// Now wait for bufferReady() signal and call decoder->read()
					

Spatial Audio

The Qt Spatial Audio module provides an API for implementation sound fields in 3D space.

参考文档编制

C++ 类

QAmbientSound 立体声叠加声音
QAudio 包含用于音频类的枚举
QAudioBuffer 表示具有特定格式和采样率的一批音频样本
QAudioDecoder 实现解码音频
QAudioDevice 音频设备及其功能的有关信息
QAudioEngine 管理 3D 声场
QAudioFormat 存储音频流参数信息
QAudioInput 表示音频的输入通道
QAudioListener 定义由 QAudioEngine 定义声场的收听人的位置和取向
QAudioOutput 表示音频的输出通道
QAudioRoom
QAudioSink 把音频数据发送到音频输出设备的接口
QAudioSource 从音频输入设备接收音频数据的接口
QMediaCaptureSession 允许捕获音频/视频内容
QMediaRecorder 用于编码和录制捕获会话
QSoundEffect 播放低延迟音效的办法
QSpatialSound 3D 空间中的声音对象

QML 类型

AmbientSound 立体声叠加声音
AudioEngine 管理 3D 场景中的声音对象
AudioInput 用于在捕获会话中捕获音频的音频输入
AudioListener 定义由 AudioEngine 定义声场的收听人的位置和取向
AudioOutput 用于回放或监视捕获会话的音频输出
AudioRoom
CaptureSession 允许捕获音频/视频内容
MediaPlayer 将媒体回放添加描述到场景
MediaRecorder 用于编码和录制在 CaptureSession 中生成的媒体
SoundEffect 提供在 QML 中播放音效方式的类型
SpatialSound 3D 空间中的声音对象
audioDevice 描述音频设备
mediaMetaData 为媒体文件提供元数据

范例

音频设备范例 Testing the available audio devices and their configuration.
音频输出范例 Enabling audio playback using the QAudioSink class.
音频录制器范例 Discovering the available devices and supported codecs.
音频源范例 Recording audio using the QAudioSource class.
空间音频平移范例 Shows some of the capabilities of the spatial audio engine in Qt