Audio-Übersicht

Audio-Funktionen
Qt Multimedia bietet eine Reihe von Audio-Kursen an, die sowohl Low-Level- als auch High-Level-Ansätze zu den Themen Audioeingabe, -ausgabe und -verarbeitung behandeln.
Details zur Audio-Implementierung
Wiedergabe komprimierter Audiodaten
Zum Abspielen von Medien oder Audiodateien, bei denen es sich nicht um einfache, unkomprimierte Audiodaten handelt, können Sie die C++-Klasse „ QMediaPlayer “ oder den QML-Typ „ MediaPlayer “ verwenden. Die Klasse „ QMediaPlayer “ und die zugehörigen QML-Typen können bei Bedarf auch Videos abspielen.
Weitere Informationen finden Sie unter „Unterstützte Medienformate “.
Der Media Player muss mit einem „ QAudioOutput “-Objekt (oder dem QML-Element „ AudioOutput “) verbunden sein, um Audio wiedergeben zu können.
So spielen Sie eine lokale Datei mit C++ ab:
player = new QMediaPlayer;
audioOutput = new QAudioOutput;
player->setAudioOutput(audioOutput);
// ...
player->setSource(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3"));
audioOutput->setVolume(0.5);
player->play();Die gleiche Funktionalität in QML:
MediaPlayer {
audioOutput: AudioOutput {}
source: "file:///path/to/my/music.mp3"
Component.onCompleted: { play() }
}Audio in eine Datei aufnehmen
Um Audio in eine Datei aufzunehmen, müssen Sie eine Aufnahmesitzung erstellen und diese mit einem Audioeingang und einem Recorder verbinden. Diese Elemente werden mit den Klassen „ QMediaCaptureSession “, „ QAudioInput “ und „ QMediaRecorder “ implementiert. Der standardmäßig erstellte „ QAudioInput “ wählt den systemweiten Standard-Audioeingang aus. Der Recorder steuert den Aufnahmeprozess mit den einfachen Funktionen `record()` und `stop()`. Darüber hinaus können Sie damit den Speicherort, den Audio-Encoder oder das Dateiformat festlegen.
Eine Audioaufnahme über das Standardmikrofon würde in C++ wie folgt aussehen:
QMediaCaptureSession session;
QAudioInput audioInput;
session.setAudioInput(&audioInput);
QMediaRecorder recorder;
session.setRecorder(&recorder);
recorder.setQuality(QMediaRecorder::HighQuality);
recorder.setOutputLocation(QUrl::fromLocalFile("test.mp3"));
recorder.record();In QML lässt sich dasselbe wie folgt erreichen:
CaptureSession {
audioInput: AudioInput {}
mediaRecorder: MediaRecorder {
id: recorder
outputLocation: "file:///path/to/test.mp3"
}
Component.onCompleted: { recorder.record() }
}QMediaCaptureSession bietet zudem Unterstützung für komplexere Anwendungsfälle wie die Bildaufnahme oder Videoaufzeichnung.
Soundeffekte mit geringer Latenz
Neben dem direkten Zugriff auf Audiogeräte bietet die Klasse „ QSoundEffect “ (sowie der QML-Typ „ SoundEffect “) eine abstraktere Möglichkeit zur Wiedergabe von Sounds. Mit dieser Klasse können Sie eine Datei im WAV-Format angeben, die bei Bedarf mit geringer Latenz wiedergegeben werden kann.
Sie können folgende Einstellungen anpassen:
- Number of loops, in dem ein Soundeffekt abgespielt wird.
- Volume des Soundeffekts.
- Muting des Soundeffekts.
Audio-Ein- und -Ausgang mit niedrigem Pegel
Die C++-API von „ Qt Multimedia “ bietet Klassen für den direkten Zugriff auf Audio-Ein- und -Ausgabefunktionen, sodass Anwendungen Rohdaten von Geräten wie Mikrofonen empfangen und Rohdaten an Lautsprecher oder andere Geräte schreiben können. Im Allgemeinen führen diese Klassen keine Audiodekodierung oder sonstige Verarbeitung durch, unterstützen jedoch verschiedene Arten von Roh-Audiodaten.
Die Klasse „ QAudioSink “ ermöglicht die Ausgabe von Roh-Audiodaten, während „ QAudioSource “ die Eingabe von Roh-Audiodaten ermöglicht. Die verfügbare Hardware bestimmt, welche Audioausgänge und -eingänge zur Verfügung stehen.
Push und Pull mit QIODevice
Die Low-Level-Audioklassen können in zwei Modi betrieben werden: „ push “ und „ pull “. Im Modus „ pull “ wird das Audiogerät durch die Übergabe von „ QIODevice “ gestartet. Bei einem Ausgabegerät ruft die Klasse „ QAudioSink “ Daten aus dem „ QIODevice “ ab (mithilfe von „ QIODevice::read()()“), wenn weitere Audiodaten benötigt werden. Umgekehrt werden im Modus „ pull “ mit „ QAudioSource “ die Audiodaten direkt in den „ QIODevice “ geschrieben, sobald sie verfügbar sind.
Im Modus „ push “ stellt das Audiogerät eine Instanz von ` QIODevice ` bereit, auf die je nach Bedarf geschrieben oder von der gelesen werden kann.
Hinweis: Die „ QIODevice “ greift nicht unmittelbar auf das Audiogerät zu, sondern puffert die Daten intern. Das bedeutet, dass die „ QIODevice “ jederzeit vom Anwendungsthread aus zum Schreiben oder Lesen von Daten verwendet werden kann, wobei eine Pufferzeit von typischerweise 250 ms hinzukommt. Wenn die Anwendung die Audiodaten nicht schnell genug an die ` QIODevice ` übergibt (für ` QAudioSink`) oder die ` QIODevice ` nicht schnell genug ausliest, kommt es zu Audioausfällen.
Callback-basierte Schnittstelle
Zusätzlich zur Verwendung einer auf „ QIODevice “ basierenden Schnittstelle bieten die Low-Level-Audioklassen eine Callback-basierte Schnittstelle, die es Benutzern ermöglicht, einen Callback zu registrieren, der im Audio-Thread aufgerufen wird, sobald das Audiogerät weitere Daten benötigt oder liefert. Dies ermöglicht eine Audioverarbeitung mit deutlich geringerer Latenz, da die Anwendung die Daten direkt im Audio-Thread verarbeiten kann.
{
QAudioFormat format;
// Format einrichten, z. B.
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(); // 220-Hz-Sinuswelle
audio->start([&phase, phaseIncrement] (QSpan<float> interleavedAudioBuffer) {
// Der Audio-Callback sollte keine Funktionen aufrufen, die möglicherweise blockieren könnten
// Den Audio-Puffer mit einer Sinuswelle füllen
const int sampleCount = interleavedAudioBuffer.size() / 2; // Stereo, also durch 2 teilen
for (int i = 0; i < sampleCount;++i) {
float sample = std::sin(phase);
interleavedAudioBuffer[i * 2] = sample; // Linker Kanal
interleavedAudioBuffer[i * 2 + 1] = sample; // Rechter Kanal
phase+= phaseIncrement; // Phase für das nächste Sample erhöhen
}
});
if (!audio->error()== QtAudio::Error::NoError) {
// Zusätzlich zu den anderen `start()`-Signaturen schlägt der Start des Audio-Callbacks fehl, wenn
// * das Backend keine callback-basierte E/A implementiert (die API ist auf allen gängigen
// Plattformen verfügbar )
// * die Signatur des Audio-Callbacks nicht mit `format.sampleFormat()` übereinstimmt
qWarning() << "Error starting audio output:" << audio->errorString();
}
}Hinweis: Diese API ist nur auf Plattformen verfügbar, die die Callback-API unterstützen: Apples CoreAudio (macOS, iOS usw.), Windows, Linux (mit dem PulseAudio- oder PipeWire-Backend) und Android.
Hinweis: Der Callback wird in einem Soft-Echtzeit-Audio-Thread aufgerufen. Es ist wichtig sicherzustellen, dass der Callback nicht blockiert, da dies zu Audio-Störungen oder Aussetzern führen kann. Dazu gehören blockierende E/A-Vorgänge, das Sperren von Mutexen, die Zuweisung von Speicher oder andere Operationen, die zu einer Blockierung führen können. Bewährte Vorgehensweisen finden Sie in Ross Bencinas Artikel „Real-time audio programming 101: time waits for nothing“. Ziehen Sie außerdem in Betracht, den Realtime-Sanitizer von Clang zur Validierung des Audio-Callbacks zu verwenden.
Dekodieren von komprimiertem Audio in den Arbeitsspeicher
In manchen Fällen möchten Sie möglicherweise eine komprimierte Audiodatei dekodieren und die weitere Verarbeitung selbst übernehmen. Beispielsweise das Mischen mehrerer Samples oder die Verwendung benutzerdefinierter Algorithmen zur digitalen Signalverarbeitung. „ QAudioDecoder “ unterstützt die Dekodierung lokaler Dateien oder Datenströme aus „ QIODevice “-Instanzen.
Hier ist ein Beispiel für die Dekodierung einer lokalen Datei:
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
Das Qt Spatial Audio Modul stellt eine API zur Implementierung von Klangfeldern im 3D-Raum bereit.
Referenzdokumentation
C++-Klassen
Ein Stereo-Overlay-Sound | |
Stellt eine Sammlung von Audio-Samples mit einem bestimmten Format und einer bestimmten Abtastrate dar | |
Wird verwendet, um dem `QMediaRecorder` über `QMediaCaptureSession` benutzerdefinierte Audio-Puffer bereitzustellen | |
Wird verwendet, um von QMediaPlayer bereitgestellte Audiodaten zu erfassen | |
Implementiert die Audiodekodierung | |
Informationen zu Audiogeräten und deren Funktionalität | |
Verwaltet ein dreidimensionales Klangfeld | |
Speichert Informationen zu den Parametern des Audiostreams | |
Stellt einen Eingangskanal für Audio dar | |
Definiert die Position und Ausrichtung der Person, die ein von der QAudioEngine definiertes Klangfeld hört | |
Stellt einen Audio-Ausgangskanal dar | |
Schnittstelle zum Senden von Audiodaten an ein Audioausgabegerät | |
Schnittstelle zum Empfangen von Audiodaten von einem Audio-Eingabegerät | |
Ermöglicht die Erfassung von Audio- und Videoinhalten | |
Wird zum Kodieren und Aufzeichnen einer Aufnahmesitzung verwendet | |
Möglichkeit zur Wiedergabe von Soundeffekten mit geringer Latenz | |
Ein Soundobjekt im 3D-Raum | |
Enthält Aufzählungslisten, die von den Audioklassen verwendet werden |
QML-Typen
Ein Stereo-Overlay-Sound | |
Verwaltet Soundobjekte innerhalb einer 3D-Szene | |
Ein Audioeingang, der zur Audioaufnahme in einer Aufnahmesitzung verwendet wird | |
Definiert die Position und Ausrichtung der Person, die ein von einer AudioEngine definiertes Klangfeld hört | |
Ein Audioausgang, der für die Wiedergabe oder das Abhören einer Aufnahmesitzung verwendet wird | |
Ermöglicht die Aufnahme von Audio- und Videoinhalten | |
Fügt einer Szene die Medienwiedergabe hinzu | |
Zur Codierung und Aufzeichnung von Medien, die in einer CaptureSession erzeugt wurden | |
Optionen für die Medienwiedergabe auf niedriger Ebene | |
Der Typ bietet eine Möglichkeit, Soundeffekte in QML abzuspielen | |
Ein Soundobjekt im 3D-Raum | |
Beschreibt ein Audiogerät | |
Stellt Metadaten für Mediendateien bereit |
Beispiele
Listet verfügbare Audiogeräte und deren Konfiguration auf. | |
Aktivierung der Audiowiedergabe mithilfe der Klasse „QAudioSink“. | |
Ermitteln der verfügbaren Geräte und der unterstützten Codecs. | |
Audioaufnahme mithilfe der Klasse `QAudioSource`. | |
Zeigt einige der Funktionen der Spatial-Audio-Engine in 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.