Sur cette page

Présentation audio

Onde sonore

Fonctionnalités audio

Qt Multimedia propose une gamme de cours sur l'audio couvrant à la fois les approches de bas niveau et de haut niveau en matière d'entrée, de sortie et de traitement audio.

Détails de mise en œuvre audio

Lecture de fichiers audio compressés

Pour lire des fichiers multimédias ou audio qui ne sont pas de simples fichiers audio non compressés, vous pouvez utiliser la classe C++ ` QMediaPlayer ` ou le type QML ` MediaPlayer `. La classe ` QMediaPlayer ` et les types QML associés permettent également de lire des vidéos, si nécessaire.

Pour plus de détails, consultez la section Formats multimédias pris en charge.

Le lecteur multimédia doit être connecté à un objet QAudioOutput (ou à l’élément QML AudioOutput ) pour lire des fichiers audio.

Voici comment lire un fichier local en C++ :

player = new QMediaPlayer;
audioOutput = new QAudioOutput;
player->setAudioOutput(audioOutput);
// ...
player->setSource(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3"));
audioOutput->setVolume(0.5);
player->play();

La même fonctionnalité en QML :

MediaPlayer {
    audioOutput: AudioOutput {}
    source: "file:///path/to/my/music.mp3"
    Component.onCompleted: { play() }
}

Enregistrement audio dans un fichier

Pour enregistrer du son dans un fichier, vous devez créer une session de capture et y associer une entrée audio et un enregistreur. Ces éléments sont implémentés à l’aide des classes ` QMediaCaptureSession`, ` QAudioInput` et ` QMediaRecorder `. L’instance par défaut de ` QAudioInput ` sélectionne l’entrée audio par défaut du système. L’enregistreur contrôle le processus d’enregistrement à l’aide de simples fonctions record() et stop(). De plus, vous pouvez l’utiliser pour sélectionner l’emplacement de sortie, l’encodeur audio ou le format du conteneur de fichiers.

Une session d’enregistrement audio à partir du microphone par défaut se présenterait comme suit en C++ :

QMediaCaptureSession session;
QAudioInput audioInput;
session.setAudioInput(&audioInput);
QMediaRecorder recorder;
session.setRecorder(&recorder);
recorder.setQuality(QMediaRecorder::HighQuality);
recorder.setOutputLocation(QUrl::fromLocalFile("test.mp3"));
recorder.record();

En QML, on peut obtenir le même résultat ainsi :

CaptureSession {
    audioInput: AudioInput {}
    mediaRecorder: MediaRecorder {
        id: recorder
        outputLocation: "file:///path/to/test.mp3"
    }
    Component.onCompleted: { recorder.record() }
}

QMediaCaptureSession prend également en charge des cas d’utilisation plus complexes, tels que la capture d’images ou l’enregistrement vidéo.

Effets sonores à faible latence

Outre l'accès brut aux périphériques audio, la classe QSoundEffect (et le type QML SoundEffect ) offre une méthode plus abstraite pour lire des sons. Cette classe vous permet de spécifier un fichier au format WAV, qui peut ensuite être lu avec une faible latence si nécessaire.

Vous pouvez régler :

Entrée et sortie audio à faible niveau

L'API C++ d'Qt Multimedia propose des classes permettant un accès brut aux fonctionnalités d'entrée et de sortie audio, ce qui permet aux applications de recevoir des données brutes provenant de périphériques tels que des microphones, et d'écrire des données brutes vers des haut-parleurs ou d'autres périphériques. En général, ces classes n'effectuent aucun décodage audio ni aucun autre traitement, mais elles peuvent prendre en charge différents types de données audio brutes.

La classe ` QAudioSink ` permet la sortie de données audio brutes, tandis que ` QAudioSource ` permet l’entrée de données audio brutes. Le matériel disponible détermine les entrées et sorties audio disponibles.

Push et Pull à l’aide de QIODevice

Les classes audio de bas niveau peuvent fonctionner selon deux modes : « push » et « pull ». En mode « pull », le périphérique audio est démarré en lui transmettant une valeur « QIODevice ». Pour un périphérique de sortie, la classe « QAudioSink » récupère les données depuis le « QIODevice » (à l’aide de « QIODevice::read()») lorsque davantage de données audio sont requises. À l’inverse, en mode « pull » avec « QAudioSource », lorsque des données audio sont disponibles, celles-ci sont directement écrites dans le « QIODevice ».

En mode « push », le périphérique audio fournit une instance de type ` QIODevice ` sur laquelle il est possible d'écrire ou de lire selon les besoins.

Remarque : l’ QIODevice n’accède pas immédiatement au périphérique audio, mais met les données en mémoire tampon en interne. Cela signifie que l’ QIODevice peut être utilisé pour écrire ou lire des données à tout moment depuis le thread de l’application, avec un temps de mise en mémoire tampon généralement de 250 ms. Si l’application ne transmet pas les données audio à l’ QIODevice suffisamment rapidement (pour QAudioSink) ou ne lit pas l’ QIODevice suffisamment rapidement, des coupures audio se produiront.

Interface basée sur les callbacks

Outre l’utilisation d’une interface basée sur l’ QIODevice, les classes audio de bas niveau fournissent une interface basée sur les callbacks qui permet aux utilisateurs d’enregistrer un callback appelé sur le thread audio chaque fois que le périphérique audio a besoin de données supplémentaires ou en transmet. Cela permet un traitement audio à très faible latence, car l’application peut traiter les données directement sur le thread audio.

{
    QAudioFormat format;
    // Configurer le format, par exemple :
    format.setSampleRate(44100);
    format.setChannelCount(2);
    format.setSampleFormat(QAudioFormat::Float);

    QAudioDevice info(QMediaDevices::defaultAudioOutput());
    if (!info.isFormatSupported(format)) {
        qWarning() << "Raw audio format not supported by backend, cannot play audio.";
       return;
    }

    audio = new QAudioSink(format, this);
    float phaseIncrement = 2 * M_PI * 220.0 / format.sampleRate(); // onde sinusoïdale à 220 Hz
    audio->start([&phase, phaseIncrement] (QSpan<float> interleavedAudioBuffer) {
        // Le callback audio ne doit appeler aucune fonction susceptible d'être bloquante

        // Remplir le tampon audio avec une onde sinusoïdale
        const int sampleCount = interleavedAudioBuffer.size() / 2; // Son stéréo, donc diviser par 2
        for (int i = 0; i < sampleCount;++i) {
            float sample = std::sin(phase);
            interleavedAudioBuffer[i * 2] = sample;    // Canal gauche
            interleavedAudioBuffer[i * 2 + 1] = sample; // Canal droit
            phase+= phaseIncrement;                    // Incrémenter la phase pour l’échantillon suivant
        }
    });

    if (!audio->error()== QtAudio::Error::NoError) {
        // Outre les autres signatures de la fonction start(), le lancement du callback audio échouera si
        // * le backend n’implémente pas d’E/S basées sur des callbacks (l’API est disponible sur toutes  les  principales
        //   plateformes)
       // * la signature de la fonction de rappel audio ne correspond pas à celle renvoyée par format.sampleFormat()

        qWarning() << "Error starting audio output:" << audio->errorString();
    }
}

Remarque : cette API n'est disponible que sur les plateformes prenant en charge l'API de rappel : CoreAudio d'Apple (macOS, iOS, etc.), Windows, Linux (utilisant le backend PulseAudio ou PipeWire) et Android.

Remarque : la fonction de rappel sera appelée sur un thread audio en temps réel logiciel. Il est important de s'assurer que la fonction de rappel ne bloque pas, car cela peut entraîner des perturbations audio ou des coupures. Cela inclut l'exécution d'opérations d'E/S bloquantes, le verrouillage de mutex, l'allocation de mémoire ou toute autre opération susceptible de bloquer le système. Pour connaître les bonnes pratiques, consultez l’article de Ross Bencina intitulé « Real-time audio programming 101: time waits for nothing ». Envisagez également d’utiliser le « Realtime sanitizer » de Clang pour valider la fonction de rappel audio.

Décodage de l’audio compressé en mémoire

Dans certains cas, vous pouvez souhaiter décoder un fichier audio compressé et effectuer vous-même un traitement supplémentaire. Par exemple, pour mixer plusieurs échantillons ou utiliser des algorithmes personnalisés de traitement du signal numérique. « QAudioDecoder » prend en charge le décodage de fichiers locaux ou de flux de données provenant d’instances « QIODevice ».

Voici un exemple de décodage d’un fichier local :

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, &QAudioDecoder::bufferReady, this, &AudioDecodingExample::readBuffer);
decoder->start();

// Now wait for bufferReady() signal and call decoder->read()

Audio spatial

Le Qt Spatial Audio module fournit une API permettant de mettre en œuvre des champs sonores dans un espace 3D.

Documentation de référence

Classes C++

QAmbientSound

Un son stéréo superposé

QAudioBuffer

Représente un ensemble d’échantillons audio avec un format et une fréquence d’échantillonnage spécifiques

QAudioBufferInput

Utilisée pour fournir des tampons audio personnalisés à QMediaRecorder via QMediaCaptureSession

QAudioBufferOutput

Utilisée pour capturer les données audio fournies par QMediaPlayer

QAudioDecoder

Implémente le décodage audio

QAudioDevice

Informations sur les périphériques audio et leurs fonctionnalités

QAudioEngine

Gère un champ sonore tridimensionnel

QAudioFormat

Stocke les informations relatives aux paramètres du flux audio

QAudioInput

Représente un canal d'entrée audio

QAudioListener

Définit la position et l'orientation de la personne écoutant un champ sonore défini par QAudioEngine

QAudioOutput

Représente un canal de sortie audio

QAudioRoom

QAudioSink

Interface permettant d’envoyer des données audio vers un périphérique de sortie audio

QAudioSource

Interface permettant de recevoir des données audio depuis un périphérique d'entrée audio

QMediaCaptureSession

Permet la capture de contenu audio et vidéo

QMediaRecorder

Utilisé pour l'encodage et l'enregistrement d'une session de capture

QSoundEffect

Moyen de lire des effets sonores à faible latence

QSpatialSound

Objet sonore dans l’espace 3D

QtAudio

Contient les énumérations utilisées par les classes audio

Types QML

AmbientSound

Un son stéréo en superposition

AudioEngine

Gère les objets sonores au sein d’une scène 3D

AudioInput

Une entrée audio destinée à la capture audio lors d'une session de capture

AudioListener

Définit la position et l'orientation de la personne écoutant un champ sonore défini par un AudioEngine

AudioOutput

Une sortie audio à utiliser pour la lecture ou le monitoring d’une session de capture

AudioRoom

CaptureSession

Permet la capture de contenu audio et vidéo

MediaPlayer

Ajoute la lecture de médias à une scène

MediaRecorder

Pour l'encodage et l'enregistrement des médias générés dans une CaptureSession

PlaybackOptions

Options de lecture multimédia de bas niveau

SoundEffect

Ce type permet de lire des effets sonores dans QML

SpatialSound

Un objet sonore dans l'espace 3D

audioDevice

Décrit un périphérique audio

mediaMetaData

Fournit des métadonnées pour les fichiers multimédias

Exemples

Audio Devices Example

Répertorie les périphériques audio disponibles et leur configuration.

Audio Output Example

Activer la lecture audio à l'aide de la classe QAudioSink.

Audio Recorder Example

Détection des périphériques disponibles et des codecs pris en charge.

Audio Source Example

Enregistrer du son à l’aide de la classe QAudioSource.

Spatial Audio Panning Example

Présente certaines des fonctionnalités du moteur audio spatial de Qt

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.