Auf dieser Seite

Audio-Übersicht

Schallwelle

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:

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

QAmbientSound

Ein Stereo-Overlay-Sound

QAudioBuffer

Stellt eine Sammlung von Audio-Samples mit einem bestimmten Format und einer bestimmten Abtastrate dar.

QAudioBufferInput

Dient zur Bereitstellung von benutzerdefinierten Audiopuffern für QMediaRecorder über QMediaCaptureSession

QAudioBufferOutput

Wird für die Erfassung von Audiodaten verwendet, die von QMediaPlayer bereitgestellt werden

QAudioDecoder

Implementiert die Dekodierung von Audio

QAudioDevice

Informationen über Audiogeräte und deren Funktionalität

QAudioEngine

Verwaltet ein dreidimensionales Klangfeld

QAudioFormat

Speichert Informationen über Audiostromparameter

QAudioInput

Repräsentiert einen Eingangskanal für Audio

QAudioListener

Definiert die Position und Ausrichtung der Person, die ein von QAudioEngine definiertes Schallfeld hört

QAudioOutput

Stellt einen Ausgangskanal für Audio dar

QAudioRoom

QAudioSink

Schnittstelle zum Senden von Audiodaten an ein Audioausgabegerät

QAudioSource

Schnittstelle für den Empfang von Audiodaten von einem Audioeingabegerät

QMediaCaptureSession

Ermöglicht das Aufnehmen von Audio- und Videoinhalten

QMediaRecorder

Wird für die Kodierung und Aufzeichnung einer Aufnahmesitzung verwendet

QSoundEffect

Möglichkeit zur Wiedergabe von Soundeffekten mit geringer Latenz

QSpatialSound

Ein Klangobjekt im 3D-Raum

QtAudio

Enthält Enums, die von den Audioklassen verwendet werden

QML-Typen

AmbientSound

Ein Stereo-Overlay-Sound

AudioEngine

Verwaltet Sound-Objekte innerhalb einer 3D-Szene

AudioInput

Ein Audioeingang, der für die Aufnahme von Audio in einer Capture-Sitzung verwendet wird

AudioListener

Definiert die Position und Ausrichtung der Person, die ein von einer AudioEngine definiertes Schallfeld hört

AudioOutput

Ein Audioausgang für die Wiedergabe oder das Monitoring einer Capture-Session

AudioRoom

CaptureSession

Ermöglicht die Aufnahme von Audio- und Videoinhalten

MediaPlayer

Fügt die Medienwiedergabe zu einer Szene hinzu

MediaRecorder

Zur Kodierung und Aufnahme von Medien, die in einer CaptureSession erzeugt wurden

PlaybackOptions

Optionen für die Medienwiedergabe auf niedriger Ebene

SoundEffect

Der Typ bietet eine Möglichkeit zur Wiedergabe von Soundeffekten in QML

SpatialSound

Ein Sound-Objekt im 3D-Raum

audioDevice

Beschreibt ein Audiogerät

mediaMetaData

Liefert Metadaten für Mediendateien

Beispiele

Audio Devices Example

Verfügbare Audiogeräte und ihre Konfiguration auflisten.

Audio Output Example

Aktivieren der Audiowiedergabe mit der Klasse QAudioSink.

Audio Recorder Example

Ermitteln der verfügbaren Geräte und unterstützten Codecs.

Audio Source Example

Aufnehmen von Audio mit der Klasse QAudioSource.

Spatial Audio Panning Example

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.