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