警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
音频概览¶

音频的播放、录制和处理。
音频特性¶
Qt Multimedia 提供了一系列音频类,涵盖了音频输入、输出和处理的低层次和高层次方法。
音频实现细节¶
播放压缩音频¶
对于播放非简单、未压缩的音频文件,您可以使用QMediaPlayer C++类,或者MediaPlayer QML类型。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格式文件,然后在需要时可以以低延迟播放。
您可以调整:
Number of loops播放音效的循环次数。
Volume音效的音量。
Muting音效的静音。
低级音频播放和录制¶
Qt Multimedia 的 C++ API 提供了用于原始访问音频输入和输出设备的类,允许应用程序从麦克风等设备接收原始数据,并将原始数据写入扬声器或其他设备。通常这些类不进行任何音频解码或其他处理,但它们可以支持不同类型的原始音频数据。
QAudioSink 类提供原始音频数据输出,而 QAudioSource 提供原始音频数据输入。可用的硬件决定了可用的音频输出和输入。
推送和拉取¶
低级音频类可以在两种模式下操作 - push 和 pull。在 pull 模式下,音频设备通过提供一个 QIODevice 来启动。对于输出设备,QAudioSink 类将在需要更多音频数据时从 QIODevice 中拉取数据(使用 QIODevice::read())。相反,对于 pull 模式下的 QAudioSource,当音频数据可用时,数据将直接写入 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 空间音频模块提供了一个用于在3D空间中实现声场的API。
参考文档¶
C++ 类¶
QAudioBuffer 类表示具有特定格式和采样率的音频样本集合。
QAudioBufferInput 类用于通过 QMediaCaptureSession 向 QMediaRecorder 提供自定义音频缓冲区。
QAudioBufferOutput 类用于捕获由 QMediaPlayer 提供的音频数据。
QAudioDecoder 类实现了音频解码。
QAudioDevice 类提供有关音频设备及其功能的信息。
QAudioFormat 类存储音频流参数信息。
表示音频的输入通道。
表示音频的输出通道。
QAudioSink 类提供了一个接口,用于将音频数据发送到音频输出设备。
QAudioSource 类提供了一个接口,用于从音频输入设备接收音频数据。
QSoundEffect 类提供了一种播放低延迟音效的方式。
QtAudio 命名空间包含音频类使用的枚举。
QMediaCaptureSession 类允许捕获音频和视频内容。
QMediaRecorder 类用于编码和录制捕获会话。
QML 类型¶
描述一个音频设备。
用于在捕获会话中捕获音频的音频输入。
用于播放或监控捕获会话的音频输出。
SoundEffect 类型提供了一种在 QML 中播放音效的方式。
向场景中添加媒体播放功能。
提供媒体文件的元数据。
允许捕获音频和视频内容。
用于编码和记录在CaptureSession中生成的媒体。
定义播放列表中的一个项目。
示例¶
Audio-Devices-Example
测试可用的音频设备及其配置。
Audio-Output-Example
使用QAudioSink类启用音频播放。
Audio-Recorder-Example
发现可用的设备和支持的编解码器。
Audio-Source-Example
使用QAudioSource类录制音频。