音频概述

音频特征

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 两种可用范例。

C++ 范例

参考文档编制

C++ 类

QAudio 包含用于音频类的枚举
QAudioBuffer 表示具有特定格式和采样率的一批音频样本
QAudioDecoder 实现解码音频
QAudioDevice 音频设备及其功能的有关信息
QAudioFormat 存储音频流参数信息
QAudioInput 表示音频的输入通道
QAudioOutput 表示音频的输出通道
QAudioSink 把音频数据发送到音频输出设备的接口
QAudioSource 从音频输入设备接收音频数据的接口
QMediaCaptureSession 允许捕获音频/视频内容
QMediaRecorder 用于编码和录制捕获会话
QSoundEffect 播放低延迟音效的办法

QML 类型

AudioInput 用于在捕获会话中捕获音频的音频输入
AudioOutput 用于回放或监视捕获会话的音频输出
CaptureSession 允许捕获音频/视频内容
MediaPlayer 将媒体回放添加描述到场景
MediaRecorder 用于编码和录制在 CaptureSession 中生成的媒体
SoundEffect 提供在 QML 中播放音效方式的类型
audioDevice 描述音频设备
mediaMetaData 为媒体文件提供元数据