警告
本节包含从 C++ 自动翻译到 Python 的代码片段,可能包含错误。
音频概述#
音轨播放、录制和处理。
音频功能#
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 中的相同功能
将音频录制到文件#
要将音频录制到文件,需要创建一个捕获会话并将其连接到音频输入和录音机。这些元素由 QMediaCaptureSession
、 QAudioInput
和 QMediaRecorder
类实现。默认构造的 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++ 类#
QAudioBuffer 类表示一组具有特定格式和采样率的音频样本。
QAudioDecoder 类实现音频解码。
QAudioDevice 类提供有关音频设备及其功能的信息。
QAudioFormat 类存储音频流参数信息。
代表音频的输入通道。
代表音频的输出通道。
QAudioSink 类提供了一个将音频数据发送到音频输出设备的接口。
QAudioSource 类提供了一个从音频输入设备接收音频数据的接口。
QSoundEffect 类提供了一种播放低延迟音效的方法。
QtAudio 命名空间包含音频类使用的枚举。
QMediaCaptureSession 类允许捕获音频和视频内容。
QMediaRecorder 类用于编码和录制捕获会话。
QML 类型#
描述了一个音频设备。
用于捕获会话中音频的音频输入。
用于播放或监控捕获会话的音频输出。
SoundEffect 类型提供了一种在 QML 中播放音效的方法。
向场景添加媒体播放功能。
为媒体文件提供元数据。
允许捕获音频和视频内容。
用于编码和录制在捕获会话中生成的媒体。
定义播放列表中的一个条目。
示例#
Audio-Devices-Example
测试可用的音频设备和它们的配置。
Audio-Output-Example
使用 QAudioSink 类启用音频播放。
Audio-Recorder-Example
发现可用的设备和支持的编解码器。
Audio-Source-Example
使用 QAudioSource 类录制音频。