Sur cette page

Vue d'ensemble de l'audio

Onde sonore

Caractéristiques audio

Qt Multimedia propose une série de cours sur l'audio qui couvrent les approches de haut et de bas niveau en matière d'entrée, de sortie et de traitement de l'audio.

Détails de l'implémentation audio

Lecture d'audio compressé

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 sont également capables de lire des vidéos, si nécessaire.

Pour plus de détails, voir Formats de médias pris en charge.

Le lecteur multimédia doit être connecté à un objet QAudioOutput (ou à l'élément QML AudioOutput ) pour lire le son.

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 de l'audio dans un fichier, vous devez créer une session de capture et y connecter une entrée audio et un enregistreur. Ces éléments sont implémentés avec les classes QMediaCaptureSession, QAudioInput, et QMediaRecorder. La classe construite par défaut 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(). En outre, vous pouvez l'utiliser pour sélectionner l'emplacement de sortie, l'encodeur audio ou le format de conteneur de fichier.

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

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

En QML, la même chose peut être obtenue par :

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

QMediaCaptureSession L'interface utilisateur permet également de prendre en charge des cas d'utilisation plus complexes tels que la capture d'images ou l'enregistrement de vidéos.

Effets sonores à faible latence

Outre l'accès brut aux dispositifs sonores, la classe QSoundEffect (et le type QML SoundEffect ) offre un moyen plus abstrait de jouer des sons. Cette classe vous permet de spécifier un fichier au format WAV, qui peut ensuite être joué avec une faible latence si nécessaire.

Vous pouvez ajuster le :

Entrée et sortie audio bas niveau

L'API C++ de Qt Multimedia offre des classes pour l'accès brut aux installations d'entrée et de sortie audio, ce qui permet aux applications de recevoir des données brutes de dispositifs tels que des microphones et d'écrire des données brutes sur des haut-parleurs ou d'autres dispositifs. En général, ces classes n'effectuent aucun décodage audio ou autre traitement, mais elles peuvent prendre en charge différents types de données audio brutes.

La classe QAudioSink offre une sortie de données audio brutes, tandis que QAudioSource offre une entrée de données audio brutes. Le matériel disponible détermine les sorties et les entrées audio disponibles.

Pousser et tirer à 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 attribuant un QIODevice. Pour un périphérique de sortie, la classe QAudioSink tire des données du QIODevice (en utilisant QIODevice::read()) lorsque davantage de données audio sont nécessaires. Inversement, en mode pull avec QAudioSource, lorsque des données audio sont disponibles, elles sont écrites directement sur QIODevice.

En mode push, le périphérique audio fournit une instance QIODevice qui peut être écrite ou lue selon les besoins.

Remarque : 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 le site QIODevice peut être utilisé pour écrire ou lire des données à tout moment à partir du fil d'exécution de l'application et qu'une mise en mémoire tampon d'environ 250 ms est ajoutée. Si l'application ne fournit pas les données audio à QIODevice assez rapidement (pour QAudioSink) ou ne lit pas QIODevice assez rapidement, des interruptions audio se produiront.

Interface basée sur des rappels

En plus d'utiliser une interface basée sur QIODevice, les classes audio de bas niveau fournissent une interface basée sur les rappels qui permet aux utilisateurs d'enregistrer un rappel qui est appelé sur le thread audio chaque fois que le périphérique audio a besoin ou fournit plus de données. Cela permet un traitement audio avec une latence beaucoup plus faible, car l'application peut traiter les données directement sur le thread audio.

{ QAudioFormat format ; // Configure le format, par exempleformat.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 de 220 Hz audio->start([&phase, phaseIncrement] (QSpan<float> interleavedAudioBuffer) { // Le callback audio ne doit pas appeler de fonctions potentiellement bloquantes // Remplir le buffer audio avec une onde sinusoïdale const int sampleCount = interleavedAudioBuffer.size() / 2; // Stéréo, donc diviser par 2 for(int i = 0; i < sampleCount ; ++i) { float sample = std::sin(phase) ; interleavedAudioBuffer[i * 2] = sample ; // Canal gaucheinterleavedAudioBuffer[i * 2 + 1] = sample ; // Canal droitphase += phaseIncrement ; // Incrémenter la phase pour l'échantillon suivant} }) ; if (!audio->error() == QtAudio::Error::NoError) { // en plus des autres signatures de start(), le démarrage du callback audio échouera si // * le backend n'implémente pas l'IO basé sur le callback (l'API est disponible sur toutes les // plateformes  majeures ) // * la signature du callback audio ne correspond pas à format.sampleFormat()
        qWarning() << "Error starting audio output:" << audio->errorString();
    } }

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

Remarque : le callback sera appelé sur un thread audio en temps réel. Il est important de s'assurer que le callback ne se bloque pas, car cela peut entraîner des problèmes audio ou des interruptions. Cela inclut l'exécution d'entrées-sorties bloquantes, le verrouillage de mutex, l'allocation de mémoires ou toute autre opération susceptible de bloquer. Pour les meilleures pratiques, consultez l'article de Ross Bencina Real-time audio programming 101 : time waits for nothing (Programmation audio en temps réel 101 : le temps n'attend rien). Pensez également à utiliser l'assainisseur temps réel de clang pour valider le callback audio.

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

Dans certains cas, vous pouvez vouloir décoder un fichier audio compressé et le traiter vous-même. Par exemple, en mélangeant plusieurs échantillons ou en utilisant des algorithmes personnalisés de traitement du signal numérique. QAudioDecoder prend en charge le décodage des fichiers locaux ou des flux de données provenant des 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()

Spatial Audio

Le module Qt Spatial Audio fournit une API pour la mise en œuvre de champs sonores dans l'espace 3D.

Documentation de référence

Classes C++

QAmbientSound

Un son stéréo superposé

QAudioBuffer

Représente une collection d'échantillons audio avec un format et une fréquence d'échantillonnage spécifiques.

QAudioBufferInput

Utilisé pour fournir des tampons audio personnalisés à QMediaRecorder par l'intermédiaire de QMediaCaptureSession

QAudioBufferOutput

Utilisé 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 sur les paramètres du flux audio

QAudioInput

Représente un canal d'entrée pour l'audio

QAudioListener

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

QAudioOutput

Représente un canal de sortie pour l'audio

QAudioRoom

QAudioSink

Interface permettant d'envoyer des données audio à un dispositif de sortie audio

QAudioSource

Interface permettant de recevoir des données audio d'un dispositif 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

Permet de jouer des effets sonores à faible latence

QSpatialSound

Un objet sonore dans l'espace 3D

QtAudio

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

Types QML

AmbientSound

Un son stéréo superposé

AudioEngine

Gère les objets sonores à l'intérieur d'une scène 3D

AudioInput

Une entrée audio à utiliser pour capturer de l'audio dans une session de capture

AudioListener

Définit la position et l'orientation de la personne qui écoute un champ sonore défini par un moteur audio.

AudioOutput

Une sortie audio à utiliser pour la lecture ou le contrôle d'une session de capture

AudioRoom

CaptureSession

Permet de capturer du 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 de média de bas niveau

SoundEffect

Le type permet de jouer des effets sonores en 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 de types

Audio Devices Example

Liste des périphériques audio disponibles et de leur configuration.

Audio Output Example

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

Audio Recorder Example

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

Audio Source Example

Enregistrement audio à l'aide de la classe QAudioSource.

Spatial Audio Panning Example

Montrer certaines des capacités du moteur audio spatial dans 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.