音頻概述

音頻特徵

Qt Multimedia offers a range of audio classes, covering both low and high level approaches to audio input, output and processing. In addition to traditional audio usage, the Qt Audio Engine QML types offer high level 3D positional audio for QML applications. See that documentation for more information.

音頻實現細節

播放壓縮音頻

對於播放不簡單媒體或音頻文件、未壓縮音頻,可以使用 QMediaPlayer C++ 類,或 Audio and MediaPlayer QML types. The QMediaPlayer 類和關聯 QML 類型還能播放 視頻 , if required. The compressed audio formats supported does depend on the operating system environment, and also what media plugins the user may have installed.

這裏是如何使用 C++ 播放本地文件:

player = new QMediaPlayer;
// ...
player->setMedia(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3"));
player->setVolume(50);
player->play();
					

You can also put files (even remote URLs) into a playlist:

player = new QMediaPlayer;
playlist = new QMediaPlaylist(player);
playlist->addMedia(QUrl("http://example.com/myfile1.mp3"));
playlist->addMedia(QUrl("http://example.com/myfile2.mp3"));
// ...
playlist->setCurrentIndex(1);
player->play();
					
					

把音頻錄製到文件

For recording audio to a file, the QAudioRecorder class allows you to compress audio data from an input device and record it.

audioRecorder = new QAudioRecorder;
QAudioEncoderSettings audioSettings;
audioSettings.setCodec("audio/amr");
audioSettings.setQuality(QMultimedia::HighQuality);
audioRecorder->setEncodingSettings(audioSettings);
audioRecorder->setOutputLocation(QUrl::fromLocalFile("test.amr"));
audioRecorder->record();
					
					

低延遲音效

In addition to the raw access to sound devices described above, the QSoundEffect 類 (和 SoundEffect QML type) offers a slightly higher level way to play sounds. These classes allow you to specify a WAV format file which can then be played with low latency when necessary. Both QSoundEffect and SoundEffect have essentially the same API.

You can adjust the number of loops a sound effect is played, as well as the volume (或 muting ) of the effect.

For older, Qt 4.x based applications QSound is also available. Applications are recommended to use QSoundEffect where possible.

在迴放 (或錄製) 期間監視音頻數據

The QAudioProbe class allows you to monitor audio data being played or recorded in the higher level classes like QMediaPlayer , QCamera and QAudioRecorder . After creating your high level class, you can simply set the source of the probe to your class, and receive audio buffers as they are processed. This is useful for several audio processing tasks, particularly for visualization or adjusting gain. You cannot modify the buffers, and they may arrive at a slightly different time than the media pipeline processes them.

Here's an example of installing a probe during recording:

audioRecorder = new QAudioRecorder;
QAudioEncoderSettings audioSettings;
audioSettings.setCodec("audio/amr");
audioSettings.setQuality(QMultimedia::HighQuality);
audioRecorder->setEncodingSettings(audioSettings);
audioRecorder->setOutputLocation(QUrl::fromLocalFile("test.amr"));
audioProbe = new QAudioProbe(this);
if (audioProbe->setSource(audioRecorder)) {
    // Probing succeeded, audioProbe->isValid() should be true.
    connect(audioProbe, SIGNAL(audioBufferProbed(QAudioBuffer)),
            this, SLOT(calculateLevel(QAudioBuffer)));
}
audioRecorder->record();
// Now audio buffers being recorded should be signaled
// by the probe, so we can do things like calculating the
// audio power level, or performing a frequency transform
					
					

低電平音頻迴放和錄製

Qt Multimedia offers classes for raw access to audio input and output facilities, allowing applications to receive raw data from devices like microphones, and to write raw data to speakers or other devices. Generally these classes do not do any audio decoding, or other processing, but they can support different types of raw audio data.

The QAudioOutput 類提供原生音頻數據輸齣,而 QAudioInput offers raw audio data input. Both classes have adjustable buffers and latency, so they are suitable for both low latency use cases (like games or VOIP) and high latency (like music playback). The available hardware determines what audio outputs and inputs are available.

壓入和拉齣

低級音頻類可以運轉於 2 種模式下 push and pull 。在 pull 模式,音頻設備的啓動是通過將它賦予 QIODevice 。對於輸齣設備, QAudioOutput 類將 pull (拉齣) 數據從 QIODevice (使用 QIODevice::read ()) 當要求更多音頻數據時。相反,對於 pull 模式采用 QAudioInput ,當音頻數據可用時,數據將被直接寫入 QIODevice .

push 模式,音頻設備提供 QIODevice instance that can be written or read to as needed. Typically this results in simpler code but more buffering, which may affect latency.

把壓縮音頻解碼到內存

In some cases you may want to decode a compressed audio file and do further processing yourself (for example, mixing multiple samples or using custom digital signal processing algorithms). QAudioDecoder 支持解碼本地文件或數據流從 QIODevice 實例。

這裏是本地文件解碼範例:

QAudioFormat desiredFormat;
desiredFormat.setChannelCount(2);
desiredFormat.setCodec("audio/x-raw");
desiredFormat.setSampleType(QAudioFormat::UnSignedInt);
desiredFormat.setSampleRate(48000);
desiredFormat.setSampleSize(16);
QAudioDecoder *decoder = new QAudioDecoder(this);
decoder->setAudioFormat(desiredFormat);
decoder->setSourceFilename("level1.mp3");
connect(decoder, SIGNAL(bufferReady()), this, SLOT(readBuffer()));
decoder->start();
// Now wait for bufferReady() signal and call decoder->read()
					
					

範例

存在 C++ 和 QML 兩種可用範例。

C++ 範例

參考文檔編製

C++ 類

QAbstractAudioDeviceInfo

用於音頻後端的基類

QAudio

包含用於音頻類的枚舉

QAudioBuffer

錶示具有特定格式和采樣率的一批音頻樣本

QAudioBuffer::StereoFrame

立體聲音頻幀的簡單包裹器

QAudioDecoder

允許解碼音頻

QAudioDeviceInfo

查詢音頻設備及其功能的接口

QAudioFormat

存儲音頻流參數信息

QAudioInput

從音頻輸入設備接收音頻數據的接口

QAudioOutput

把音頻數據發送到音頻輸齣設備的接口

QAudioProbe

允許監視正播放 (或錄製) 音頻

QAudioSystemPlugin

音頻插件抽象基

QSound

播放 .wav 聲音文件的方法

QSoundEffect

播放低延遲音效的辦法

QML 類型

Audio 把音頻迴放添加到場景

MediaPlayer

把媒體迴放添加到場景

Playlist

針對要播放的指定媒體列錶

PlaylistItem

定義 Playlist 項

SoundEffect

提供在 QML 中播放音效方式的類型