音频概述
音频特性
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() } }
将音频录制到文件中
要将音频录制到文件中,您需要创建一个捕获会话,并将其连接到一个音频输入和一个录音机。这些元素使用 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多媒体的C++ API提供了一组类,用于直接访问音频输入和输出设备功能,允许应用程序从麦克风等设备接收原始数据,并将原始数据写入扬声器或其他设备。通常,这些类不会进行任何音频解码或其他处理,但可以支持不同类型的原始音频数据。
QAudioSink 类提供原始音频数据输出,而 QAudioSource 类提供原始音频数据输入。可用的硬件决定了可用的音频输入和输出。
推模式和拉模式
低级音频类可以在两种模式下运行 - push
和 pull
。在 pull
模式下,通过提供一个 QIODevice 来启动音频设备。对于输出设备,当需要更多信息时,QAudioSink 类将从 QIODevice 中拉取数据(使用 QIODevice::read())。相反,对于带有 QAudioSource 的 pull
模式,当有音频数据可用时,数据将直接写入 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++类
立体声覆盖声音 | |
表示特定格式和采样率的音频样本集合 | |
实现音频解码 | |
有关音频设备和它们的功能的信息 | |
管理三维声场 | |
存储音频流参数信息 | |
代表音频的输入通道 | |
定义用户听到的QAudioEngine定义的声场的位置和朝向 | |
代表音频输出通道 | |
将音频数据发送到音频输出设备的接口 | |
从音频输入设备接收音频数据的接口 | |
允许捕获音频和视频内容 | |
用于编码和录制捕获会话 | |
播放低延迟声音效果的方式 | |
3D空间中的一个声音对象 | |
包含由音频类使用的枚举 |
QML类型
立体声覆盖声音 | |
管理3D场景内的声音对象 | |
用于在捕获会话中捕获音频的音频输入 | |
定义通过AudioEngine定义的声音场的听者的位置和朝向 | |
用于播放或监控捕获会话的音频输出 | |
允许捕获音频和视频内容 | |
向场景添加媒体播放 | |
用于在捕获会话中生成的媒体编码和录制 | |
类型为在QML中播放声音效果提供了一种方式 | |
3D空间中的一个声音对象 | |
描述一个音频设备 | |
为媒体文件提供元数据 |
示例
© 2024 Qt公司。本文档的贡献是各自所有者的版权。本文档的提供受免费软件基金会发布的GNU自由文档许可版本1.3条款的约束。Qt及其相应的标志是芬兰的Qt公司及其在全世界各国/地区的商标。所有其他商标均为各自所有者的财产。