Qt Multimedia 提供了涵盖低级/高级途径的一系列音频类:音频输入、输出和处理。
对于播放不简单媒体或音频文件、未压缩音频,可以使用 QMediaPlayer C++ 类,或 MediaPlayer QML 类型。 QMediaPlayer 类和关联 QML 类型还能播放 video ,若有要求。播放器支持的音频格式从属:
媒体播放器需要连接到 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.setMediaRecorder(&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 提供了用于原生访问音频输入和输出设施的类,允许应用程序从像麦克风的设备接收原生数据,并将原生数据写入扬声器或其它设备。这些类一般不做任何音频解码或其它处理,但它们可以支持不同类型的原生音频数据。
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()
存在 C++ 和 QML 两种可用范例。
| QAudio | 包含用于音频类的枚举 | 
| QAudioBuffer | 表示具有特定格式和采样率的一批音频样本 | 
| QAudioDecoder | 实现解码音频 | 
| QAudioDevice | 音频设备及其功能的有关信息 | 
| QAudioFormat | 存储音频流参数信息 | 
| QAudioInput | 表示音频的输入通道 | 
| QAudioOutput | 表示音频的输出通道 | 
| QAudioSink | 把音频数据发送到音频输出设备的接口 | 
| QAudioSource | 从音频输入设备接收音频数据的接口 | 
| QMediaCaptureSession | 允许捕获音频/视频内容 | 
| QMediaRecorder | 用于编码和录制捕获会话 | 
| QSoundEffect | 播放低延迟音效的办法 | 
| AudioInput | 用于在捕获会话中捕获音频的音频输入 | 
| AudioOutput | 用于回放或监视捕获会话的音频输出 | 
| CaptureSession | 允许捕获音频/视频内容 | 
| MediaPlayer | 将媒体回放添加描述到场景 | 
| MediaRecorder | 用于编码和录制在 CaptureSession 中生成的媒体 | 
| SoundEffect | 提供在 QML 中播放音效方式的类型 | 
| audioDevice | 描述音频设备 | 
| mediaMetaData | 为媒体文件提供元数据 |