Audio Overview
Audio Features
Qt Multimedia offers a range of audio classes that cover both low and high level approaches to: audio input, output and processing.
Audio Implementation Details
Playing Compressed Audio
For playing media or audio files that are not simple, uncompressed audio, you can use the QMediaPlayer C++ class, or the MediaPlayer QML type. The QMediaPlayer class and associated QML types are also capable of playing video, if required. The compressed audio formats supported depends on:
- The operating system environment.
- Any decoder plugins the user may have installed.
Here is how you play a local file using C++:
player = new QMediaPlayer; // ... player->setSource(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3")); player->setVolume(50); player->play();
Recording Audio to a File
For recording audio to a file, the QMediaRecorder class allows you to compress audio data from an input device and record it.
QMediaCaptureSession session; QAudioInput audioInput; session.setAudioInput(&input); QMediaRecorder recorder; session.setMediaRecorder(&recorder); recorder.setQuality(QMediaRecorder::HighQuality); recorder.setOutputLocation(QUrl::fromLocalFile("test.mp3")); recorder.record();
QMediaCaptureSession provides support for more complex use cases involving the capturing and recording of audio.
Low Latency Sound Effects
In addition to raw access to sound devices, the QSoundEffect class (and SoundEffect QML type) offers a more abstract way to play sounds. This class allows you to specify a WAV format file, which can then be played with low latency when necessary.
You can adjust the:
- Number of loops in which a sound effect is played.
- Volume of the sound effect.
- Muting of the sound effect.
Low Level Audio Playback and Recording
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 QAudioSink class offers raw audio data output, while QAudioSource offers raw audio data input. The available hardware determines what audio outputs and inputs are available.
Push and Pull
The low level audio classes can operate in two modes - push
and pull
. In pull
mode, the audio device is started by giving it a QIODevice. For an output device, the QAudioSink class will pull data from the QIODevice (using QIODevice::read()) when more audio data is required. Conversely, for pull
mode with QAudioSource, when audio data is available then the data will be written directly to the QIODevice.
In push
mode, the audio device provides a QIODevice instance that can be written or read to as needed. Typically, this results in simpler code but more buffering, which may affect latency.
Decoding Compressed Audio to Memory
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 supports decoding local files or data streams from QIODevice instances.
Here's an example of decoding a local file:
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()
Examples
There are both C++ and QML examples available.
C++ Examples
Reference Documentation
C++ Classes
Contains enums used by the audio classes | |
Represents a collection of audio samples with a specific format and sample rate | |
Implements decoding audio | |
Information about audio devices and their functionality | |
Stores audio stream parameter information | |
QAudioOutput class represents an input channel for audio | |
Represents an output channel for audio | |
Interface for sending audio data to an audio output device | |
Interface for receiving audio data from an audio input device | |
Way to play low latency sound effects |
QML Types
Add audio playback to a scene | |
Add media playback to a scene | |
For specifying a list of media to be played | |
Defines an item in a Playlist | |
Type provides a way to play sound effects in QML |