Vue d'ensemble de l'audio

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 :
- Number of loops l'endroit où l'effet sonore est joué.
- Volume de l'effet sonore.
- Muting de l'effet sonore.
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++
Un son stéréo superposé | |
Représente une collection d'échantillons audio avec un format et une fréquence d'échantillonnage spécifiques. | |
Utilisé pour fournir des tampons audio personnalisés à QMediaRecorder par l'intermédiaire de QMediaCaptureSession | |
Utilisé pour capturer les données audio fournies par QMediaPlayer | |
Implémente le décodage audio | |
Informations sur les périphériques audio et leurs fonctionnalités | |
Gère un champ sonore tridimensionnel | |
Stocke les informations sur les paramètres du flux audio | |
Représente un canal d'entrée pour l'audio | |
Définit la position et l'orientation de la personne qui écoute un champ sonore défini par QAudioEngine | |
Représente un canal de sortie pour l'audio | |
Interface permettant d'envoyer des données audio à un dispositif de sortie audio | |
Interface permettant de recevoir des données audio d'un dispositif d'entrée audio | |
Permet la capture de contenu audio et vidéo | |
Utilisé pour l'encodage et l'enregistrement d'une session de capture | |
Permet de jouer des effets sonores à faible latence | |
Un objet sonore dans l'espace 3D | |
Contient des énumérations utilisées par les classes audio |
Types QML
Un son stéréo superposé | |
Gère les objets sonores à l'intérieur d'une scène 3D | |
Une entrée audio à utiliser pour capturer de l'audio dans une session de capture | |
Définit la position et l'orientation de la personne qui écoute un champ sonore défini par un moteur audio. | |
Une sortie audio à utiliser pour la lecture ou le contrôle d'une session de capture | |
Permet de capturer du contenu audio et vidéo | |
Ajoute la lecture de médias à une scène | |
Pour l'encodage et l'enregistrement des médias générés dans une CaptureSession | |
Options de lecture de média de bas niveau | |
Le type permet de jouer des effets sonores en QML | |
Un objet sonore dans l'espace 3D | |
Décrit un périphérique audio | |
Fournit des métadonnées pour les fichiers multimédias |
Exemples de types
Liste des périphériques audio disponibles et de leur configuration. | |
Activation de la lecture audio à l'aide de la classe QAudioSink. | |
Découverte des périphériques disponibles et des codecs pris en charge. | |
Enregistrement audio à l'aide de la classe QAudioSource. | |
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.