警告

本节包含从 C++ 自动翻译到 Python 的代码片段,可能包含错误。

音频概述#

sound-wave-small1

音轨播放、录制和处理。

音频功能#

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

音频实现细节#

播放压缩音频#

对于播放非简单未压缩音频文件,可以使用 C++ 的 QMediaPlayer 类,或者 QML 的 MediaPlayer 类型。当需要时,QMediaPlayer 类和相关 QML 类型也可以播放视频。

请参阅 支持的媒体格式 了解更多详细信息。

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

下面是如何使用 C++ 播放本地文件的示例

player = QMediaPlayer()
audioOutput = QAudioOutput()
player.setAudioOutput(audioOutput)
# ...
player.setSource(QUrl.fromLocalFile("/Users/me/Music/coolsong.mp3"))
audioOutput.setVolume(50)
player.play()

在 QML 中的相同功能

将音频录制到文件#

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

以下是在 C++ 中录制默认麦克风的会话录制示例

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

在 QML 中,可以通过以下方式实现相同的功能

QMediaCaptureSession 还提供对更复杂用例的支持,如图像捕获或视频录制。

低延迟音效#

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

您可以调整

  • 循环次数,以确定音效播放的循环次数。

  • 音量,以设置音效的音量。

  • 静音,以静音音效。

低级音频播放和录制#

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

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

推送和拉取#

低级音频类可以以两种模式操作——`push` 和 `pull`。在 `pull` 模式下,通过给音频设备一个 QIODevice 来启动该设备。对于输出设备,当需要更多的音频数据时,`QAudioSink` 类将通过使用 QIODevice::read() 从 QIODevice 拉取数据。相反,对于使用 `QAudioSource` 的 `pull` 模式,当音频数据可用时,数据将被直接写入 QIODevice。

在 `push` 模式下,音频设备提供了可以按需写入或读取的 QIODevice 实例。通常,这会导致更简单的代码但更多的缓冲,这可能会影响延迟。

将压缩音频解码到内存中#

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

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

desiredFormat = QAudioFormat()
desiredFormat.setChannelCount(2)
desiredFormat.setSampleFormat(QAudioFormat.Int16)
desiredFormat.setSampleRate(48000)
decoder = QAudioDecoder(self)
decoder.setAudioFormat(desiredFormat)
decoder.setSource("level1.mp3")
decoder.bufferReady.connect(self.readBuffer)
decoder.start()
# Now wait for bufferReady() signal and call decoder->read()

空间音频#

Qt 空间音频模块提供了一个 API 用于实现 3D 空间的声音场。

参考文档#

C++ 类#

PySide6.QtMultimedia.QAudioBuffer

QAudioBuffer 类表示一组具有特定格式和采样率的音频样本。

PySide6.QtMultimedia.QAudioDecoder

QAudioDecoder 类实现音频解码。

PySide6.QtMultimedia.QAudioDevice

QAudioDevice 类提供有关音频设备及其功能的信息。

PySide6.QtMultimedia.QAudioFormat

QAudioFormat 类存储音频流参数信息。

PySide6.QtMultimedia.QAudioInput

代表音频的输入通道。

PySide6.QtMultimedia.QAudioOutput

代表音频的输出通道。

PySide6.QtMultimedia.QAudioSink

QAudioSink 类提供了一个将音频数据发送到音频输出设备的接口。

PySide6.QtMultimedia.QAudioSource

QAudioSource 类提供了一个从音频输入设备接收音频数据的接口。

PySide6.QtMultimedia.QSoundEffect

QSoundEffect 类提供了一种播放低延迟音效的方法。

qtaudio.html

QtAudio 命名空间包含音频类使用的枚举。

PySide6.QtMultimedia.QMediaCaptureSession

QMediaCaptureSession 类允许捕获音频和视频内容。

PySide6.QtMultimedia.QMediaRecorder

QMediaRecorder 类用于编码和录制捕获会话。

QML 类型#

qml-audiodevice.html

描述了一个音频设备。

qml-qtmultimedia-audioinput.html

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

qml-qtmultimedia-audiooutput.html

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

qml-qtmultimedia-soundeffect.html

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

qml-qtmultimedia-mediaplayer.html

向场景添加媒体播放功能。

qml-mediametadata.html

为媒体文件提供元数据。

qml-qtmultimedia-capturesession.html

允许捕获音频和视频内容。

qml-qtmultimedia-mediarecorder.html

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

定义播放列表中的一个条目。

示例#

Audio-Devices-Example

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

Audio-Output-Example

使用 QAudioSink 类启用音频播放。

Audio-Recorder-Example

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

Audio-Source-Example

使用 QAudioSource 类录制音频。