Audio-Übersicht

Audio-Merkmale
Qt Multimedia bietet eine Reihe von Audioklassen, die sowohl einfache als auch anspruchsvolle Ansätze für Audioeingabe, -ausgabe und -verarbeitung abdecken.
Details zur Audio-Implementierung
Komprimiertes Audio abspielen
Für die Wiedergabe von Medien oder Audiodateien, bei denen es sich nicht um einfache, unkomprimierte Audiodateien 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 Einzelheiten finden Sie unter Unterstützte Medienformate.
Der Media Player muss mit einem QAudioOutput Objekt (oder dem QML AudioOutput Element) verbunden sein, um Audio wiedergeben zu können.
Hier sehen Sie, wie Sie eine lokale Datei mit C++ abspielen:
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 einer Datei aufnehmen
Um Audio in einer Datei aufzuzeichnen, müssen Sie eine Aufnahmesitzung erstellen und mit dieser einen Audioeingang und einen Rekorder verbinden. Diese Elemente werden mit den Klassen QMediaCaptureSession, QAudioInput und QMediaRecorder implementiert. Die Standardkonstruktion QAudioInput wählt den Standard-Audioeingang des Systems aus. Der Rekorder steuert den Aufnahmeprozess mit einfachen record()- und stop()-Funktionen. Außerdem können Sie damit den Ausgabeort, den Audio-Encoder oder das Dateicontainerformat auswählen.
Eine Sitzung, die Audio vom Standardmikrofon aufnimmt, würde in C++ wie folgt aussehen:
QMediaCaptureSession session; QAudioInput audioInput; session.setAudioInput(&input); QMediaRecorder recorder; session.setRecorder(&recorder); recorder.setQuality(QMediaRecorder::HighQuality); recorder.setOutputLocation(QUrl::fromLocalFile("test.mp3")); recorder.record();
In QML kann das Gleiche erreicht werden durch:
CaptureSession { audioInput: AudioInput {} mediaRecorder: MediaRecorder { id: recorder outputLocation: "file:///path/to/test.mp3" } Component.onCompleted: { recorder.record() } }
QMediaCaptureSession bietet auch Unterstützung für komplexere Anwendungsfälle wie Bild- oder Videoaufzeichnung.
Toneffekte mit niedriger Latenzzeit
Neben dem direkten Zugriff auf Soundgeräte bietet die Klasse QSoundEffect (und 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 dann bei Bedarf mit geringer Latenz abgespielt werden kann.
Sie können die:
- Number of loops in der ein Soundeffekt abgespielt wird.
- Volume des Soundeffekts.
- Muting des Soundeffekts.
Low-Level-Audioeingang und -ausgang
Die C++-API von Qt Multimedia bietet Klassen für den rohen Zugriff auf Audioeingabe- und -ausgabemöglichkeiten, die es Anwendungen ermöglichen, Rohdaten von Geräten wie Mikrofonen zu empfangen und Rohdaten auf Lautsprecher oder andere Geräte zu schreiben. Im Allgemeinen führen diese Klassen keine Audio-Dekodierung oder andere Verarbeitung durch, aber sie können verschiedene Arten von Audio-Rohdaten unterstützen.
Die Klasse QAudioSink bietet die Ausgabe roher Audiodaten, während QAudioSource die Eingabe roher Audiodaten ermöglicht. Die verfügbare Hardware bestimmt, welche Audioausgänge und -eingänge verfügbar sind.
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 gestartet, indem ihm ein QIODevice zugewiesen wird. Für ein Ausgabegerät zieht die Klasse QAudioSink Daten von QIODevice (mit QIODevice::read()), wenn mehr Audiodaten benötigt werden. Umgekehrt werden im Modus pull mit QAudioSource, wenn Audiodaten verfügbar sind, die Daten direkt in QIODevice geschrieben.
Im Modus push stellt das Audiogerät eine Instanz von QIODevice zur Verfügung, in die je nach Bedarf geschrieben oder gelesen werden kann.
Hinweis: Die QIODevice greift nicht direkt auf das Audiogerät zu, sondern puffert die Daten intern. Das bedeutet, dass QIODevice jederzeit zum Schreiben oder Lesen von Daten aus dem Anwendungsthread verwendet werden kann und eine Pufferung von typischerweise 250ms hinzugefügt wird. Wenn die Anwendung die Audiodaten nicht schnell genug an QIODevice liefert (für QAudioSink) oder QIODevice nicht schnell genug liest, kommt es zu Audioaussetzern.
Callback-basierte Schnittstelle
Zusätzlich zur Verwendung einer QIODevice basierten Schnittstelle bieten die Low-Level-Audioklassen eine Callback-basierte Schnittstelle, die es dem Benutzer 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 wesentlich geringere Latenz bei der Audioverarbeitung, da die Anwendung die Daten direkt im Audio-Thread verarbeiten kann.
{ QAudioFormat format; // Einrichten des Formats, 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 // Füllen Sie den Audiopuffer mit einer Sinuswelle 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 KanalinterleavedAudioBuffer[i * 2 + 1] = sample; // Rechter Kanalphase += phaseIncrement; // Phase für nächstes Sample erhöhen} }); if (!audio->error() == QtAudio::Error::NoError) { // zusätzlich zu den anderen start()-Signaturen schlägt das Starten des Audio-Callbacks fehl, wenn // * das Backend kein callback-basiertes IO implementiert (die API ist auf allen wichtigen // 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, etc.), Windows, Linux (unter Verwendung des PulseAudio- oder PipeWire-Backends) und Android.
Hinweis: Der Callback wird in einem Soft-Realtime-Audio-Thread aufgerufen. Es ist wichtig sicherzustellen, dass der Callback nicht blockiert, da dies zu Audiostörungen oder Aussetzern führen kann. Dazu gehören die Durchführung von blockierenden IO, das Sperren von Mutexen, die Zuweisung von Speicher oder andere Operationen, die blockieren können. Best Practices finden Sie in Ross Bencinas Artikel Echtzeit-Audio-Programmierung 101: Die Zeit wartet auf nichts. Ziehen Sie auch in Betracht, den Realtime Sanitizer von Clang zu verwenden, um den Audio-Callback zu validieren.
Dekodierung von komprimiertem Audio in den Speicher
In manchen Fällen möchten Sie vielleicht eine komprimierte Audiodatei dekodieren und selbst weiterverarbeiten. Zum Beispiel, wenn Sie mehrere Samples mischen oder benutzerdefinierte digitale Signalverarbeitungsalgorithmen verwenden. QAudioDecoder unterstützt die Dekodierung lokaler Dateien oder Datenströme von 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 bietet eine API für die Implementierung von Schallfeldern im 3D-Raum.
Referenz-Dokumentation
C++-Klassen
Ein Stereo-Overlay-Sound | |
Stellt eine Sammlung von Audio-Samples mit einem bestimmten Format und einer bestimmten Abtastrate dar. | |
Dient zur Bereitstellung von benutzerdefinierten Audiopuffern für QMediaRecorder über QMediaCaptureSession | |
Wird für die Erfassung von Audiodaten verwendet, die von QMediaPlayer bereitgestellt werden | |
Implementiert die Dekodierung von Audio | |
Informationen über Audiogeräte und deren Funktionalität | |
Verwaltet ein dreidimensionales Klangfeld | |
Speichert Informationen über Audiostromparameter | |
Repräsentiert einen Eingangskanal für Audio | |
Definiert die Position und Ausrichtung der Person, die ein von QAudioEngine definiertes Schallfeld hört | |
Stellt einen Ausgangskanal für Audio dar | |
Schnittstelle zum Senden von Audiodaten an ein Audioausgabegerät | |
Schnittstelle für den Empfang von Audiodaten von einem Audioeingabegerät | |
Ermöglicht das Aufnehmen von Audio- und Videoinhalten | |
Wird für die Kodierung und Aufzeichnung einer Aufnahmesitzung verwendet | |
Möglichkeit zur Wiedergabe von Soundeffekten mit geringer Latenz | |
Ein Klangobjekt im 3D-Raum | |
Enthält Enums, die von den Audioklassen verwendet werden |
QML-Typen
Ein Stereo-Overlay-Sound | |
Verwaltet Sound-Objekte innerhalb einer 3D-Szene | |
Ein Audioeingang, der für die Aufnahme von Audio in einer Capture-Sitzung verwendet wird | |
Definiert die Position und Ausrichtung der Person, die ein von einer AudioEngine definiertes Schallfeld hört | |
Ein Audioausgang für die Wiedergabe oder das Monitoring einer Capture-Session | |
Ermöglicht die Aufnahme von Audio- und Videoinhalten | |
Fügt die Medienwiedergabe zu einer Szene hinzu | |
Zur Kodierung und Aufnahme von Medien, die in einer CaptureSession erzeugt wurden | |
Optionen für die Medienwiedergabe auf niedriger Ebene | |
Der Typ bietet eine Möglichkeit zur Wiedergabe von Soundeffekten in QML | |
Ein Sound-Objekt im 3D-Raum | |
Beschreibt ein Audiogerät | |
Liefert Metadaten für Mediendateien |
Beispiele
Verfügbare Audiogeräte und ihre Konfiguration auflisten. | |
Aktivieren der Audiowiedergabe mit der Klasse QAudioSink. | |
Ermitteln der verfügbaren Geräte und unterstützten Codecs. | |
Aufnehmen von Audio mit der Klasse QAudioSource. | |
Zeigt einige der Möglichkeiten 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.