Auf dieser Seite

QAudioSink Class

Die Klasse QAudioSink bietet eine Schnittstelle zum Senden von Audiodaten an ein Audioausgabegerät. Mehr...

Kopfzeile: #include <QAudioSink>
CMake: find_package(Qt6 REQUIRED COMPONENTS Multimedia)
target_link_libraries(mytarget PRIVATE Qt6::Multimedia)
qmake: QT += multimedia
Erbt: QObject

Öffentliche Funktionen

QAudioSink(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
virtual ~QAudioSink() override
(since 6.10) qsizetype bufferFrameCount() const
qsizetype bufferSize() const
qsizetype bytesFree() const
qint64 elapsedUSecs() const
QtAudio::Error error() const
QAudioFormat format() const
(since 6.10) qsizetype framesFree() const
bool isNull() const
qint64 processedUSecs() const
void reset()
void resume()
(since 6.10) void setBufferFrameCount(qsizetype value)
void setBufferSize(qsizetype value)
void setVolume(qreal volume)
QIODevice *start()
(since 6.11) void start(Callback &&cb)
void start(QIODevice *device)
QtAudio::State state() const
void stop()
void suspend()
qreal volume() const

Signale

void stateChanged(QtAudio::State state)

Detaillierte Beschreibung

Sie können einen Audioausgang mit dem Standard-Audioausgabegerät des Systems erstellen. Es ist auch möglich, QAudioSink mit einem spezifischen QAudioDevice zu erstellen. Wenn Sie die Audioausgabe erstellen, sollten Sie auch die QAudioFormat für die Wiedergabe verwenden (siehe die Klassenbeschreibung QAudioFormat für Details).

QAudioSink kann in zwei verschiedenen Modi verwendet werden:

  • Verwendung einer QIODevice aus einem Anwendungsthread
  • Verwendung einer Callback-basierten Schnittstelle aus dem Audio-Thread

QIODevice-Schnittstelle

Das Abspielen eines Audiostroms wird einfach durch den Aufruf von start() mit einem QIODevice gestartet. QAudioSink holt dann die benötigten Daten vom io-Gerät. Das Abspielen einer Audiodatei ist also so einfach wie:

QFile sourceFile; // class member.QAudioSink* audio; // Klassenmitglied.{ sourceFile.setFileName("/tmp/test.raw"); sourceFile.open(QIODevice::ReadOnly);    QAudioFormat format; // Einrichten des Formats, z. B.format.setSampleRate(44100); format.setChannelCount(1); format.setSampleFormat(QAudioFormat::Int16);    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); connect(audio, QAudioSink::stateChanged, this, &AudioInputExample::handleStateChanged);  audio->start(&sourceFile); }

Die Datei wird abgespielt, vorausgesetzt, das Audiosystem und das Ausgabegerät unterstützen dies. Wenn Sie kein Glück haben, prüfen Sie, was mit der Funktion error() los ist.

Nachdem die Datei abgespielt wurde, müssen wir das Gerät anhalten:

void AudioOutputExample::stopAudioOutput()
{
    audio->stop();
    sourceFile.close();
    delete audio;
}

Zu jedem Zeitpunkt befindet sich QAudioSink in einem von vier Zuständen: aktiv, angehalten, gestoppt oder im Leerlauf. Diese Zustände werden durch das QtAudio::State enum beschrieben.

Threading-Modell und Pufferung

Die Schnittstelle QIODevice ist so konzipiert, dass sie vom Anwendungsthread aus verwendet werden kann. Für die Kommunikation mit dem Audio-Thread wird ein wartungsfreier Ringbuffer verwendet. Die Größe dieses Ringpuffers kann mit setBufferSize() konfiguriert werden und ist standardmäßig auf 250ms eingestellt. Der Zustand dieses Puffers kann mit bytesFree() abgefragt werden. Wenn der Ringpuffer keine Daten mehr enthält, sendet der Audio-Thread Stille an das Audiogerät und der Status wechselt zu QtAudio::IdleState und kehrt zu QtAudio::ActiveState zurück, sobald mehr Daten von QIODevice verfügbar sind.

Callback-Schnittstelle

Der bevorzugte Weg, um eine niedrige Audio-Latenzzeit zu erreichen, ist die Verwendung der Callback-basierten Schnittstelle. Sie ermöglicht es Ihnen, Audiodaten direkt in das Audiogerät zu schreiben, ohne einen QIODevice zu durchlaufen. Dies geschieht durch den Aufruf von start() mit einer Callback-Funktion, die vom Audio-Thread aufgerufen wird. Diese Callback-Funktion wird mit einem QSpan<SampleType> aufgerufen, wenn das Audio-Backend Daten benötigt.

QAudioSink* audio; // Klassenmitglied.float phase; // Klassenmitglied.{ 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 der Start 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();
    } }

Im Gegensatz zur QIODevice-basierten Schnittstelle kann sich der QAudioSink nur in den Zuständen active, suspendend und stopped befinden. Die setBufferSize() API ist bei Verwendung des Callbacks nicht verfügbar, die Größe des Callback-Arguments wird vom Audio-Backend bestimmt.

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.

Zustand und Fehlerbehandlung

Zustandsänderungen werden durch das Signal stateChanged() gemeldet. Sie können dieses Signal verwenden, um z. B. die grafische Benutzeroberfläche der Anwendung zu aktualisieren; das banale Beispiel hierfür ist die Änderung des Zustands einer Schaltfläche play/pause. Eine Zustandsänderung fordern Sie direkt mit suspend(), stop(), reset(), resume() und start() an.

Der QAudioSink wird die StoppedState eingeben, wenn ein Fehler auftritt. Die error type kann mit der Funktion error() abgerufen werden. Eine Beschreibung der möglichen Fehler, die gemeldet werden, finden Sie im QtAudio::Error enum. Der Aufruf von stop() oder reset() setzt den Fehlerzustand auf NoError zurück.

Sie können auf Fehler prüfen, indem Sie sich mit dem Signal stateChanged() verbinden:

void AudioOutputExample::handleStateChanged(QtAudio::State newState)
{
    switch (newState) {
        case QtAudio::IdleState:
            // Finished playing (no more data)
            AudioOutputExample::stopAudioOutput();
            break;

        case QtAudio::StoppedState:
            // Stopped for other reasons
            if (audio->error() != QtAudio::NoError) {
                // Error handling
            }
            break;

        default:
            // ... other cases as appropriate
            break;
    }
}

Siehe auch QAudioSource und QAudioDevice.

Dokumentation der Mitgliederfunktionen

[explicit] QAudioSink::QAudioSink(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)

Konstruieren Sie einen neuen Audioausgang und verbinden Sie ihn mit parent. Das Standard-Audioausgabegerät wird mit den Parametern der Ausgabe format verwendet. Wenn format standardmäßig initialisiert ist, wird das Format auf das bevorzugte Format des Audiogeräts gesetzt.

[explicit] QAudioSink::QAudioSink(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)

Konstruieren Sie einen neuen Audioausgang und verbinden Sie ihn mit parent. Das Gerät, auf das audioDevice verweist, wird mit den Parametern des Ausgangs format verwendet. Wenn format standardmäßig initialisiert ist, wird das Format auf das bevorzugte Format von audioDevice gesetzt.

[override virtual noexcept] QAudioSink::~QAudioSink()

Zerstört diesen Audioausgang.

Dadurch werden alle verwendeten Systemressourcen und Puffer freigegeben.

[since 6.10] qsizetype QAudioSink::bufferFrameCount() const

Gibt die Größe des Audiopuffers in Frames zurück.

Wenn vor start() aufgerufen, wird der Standardwert der Plattform zurückgegeben. Wenn vor start() aufgerufen, aber setBufferSize() oder setBufferFrameCount() vorher aufgerufen wurde, wird der Wert zurückgegeben, der durch setBufferSize() oder setBufferFrameCount() festgelegt wurde. Wenn nach start() aufgerufen, wird die tatsächliche Puffergröße zurückgegeben, die verwendet wird. Diese darf nicht diejenige sein, die zuvor durch setBufferSize() oder setBufferFrameCount() gesetzt wurde.

Diese Funktion wurde in Qt 6.10 eingeführt.

Siehe auch setBufferFrameCount() und bufferSize.

qsizetype QAudioSink::bufferSize() const

Gibt die Größe des Audiopuffers in Bytes zurück.

Wenn vor start() aufgerufen, wird der Standardwert der Plattform zurückgegeben. Wenn vor start() aufgerufen, aber setBufferSize() oder setBufferFrameCount() vorher aufgerufen wurde, wird der Wert zurückgegeben, der durch setBufferSize() oder setBufferFrameCount() festgelegt wurde. Wenn nach start() aufgerufen, wird die tatsächliche Puffergröße zurückgegeben, die verwendet wird. Diese darf nicht diejenige sein, die zuvor durch setBufferSize() oder setBufferFrameCount() gesetzt wurde.

Siehe auch setBufferSize() und bufferFrameCount.

qsizetype QAudioSink::bytesFree() const

Gibt die Anzahl der im Audiopuffer verfügbaren freien Bytes zurück.

Hinweis: Der zurückgegebene Wert ist nur im Zustand QtAudio::ActiveState oder QtAudio::IdleState gültig, ansonsten wird Null zurückgegeben.

Siehe auch framesFree.

qint64 QAudioSink::elapsedUSecs() const

Gibt die Mikrosekunden seit dem Aufruf von start() zurück, einschließlich der Zeit im Leerlauf und im Suspend-Zustand.

QtAudio::Error QAudioSink::error() const

Gibt den Fehlerstatus zurück.

QAudioFormat QAudioSink::format() const

Gibt die QAudioFormat zurück, die verwendet wird.

[since 6.10] qsizetype QAudioSink::framesFree() const

Gibt die Anzahl der freien Frames zurück, die im Audiopuffer verfügbar sind.

Hinweis: Der zurückgegebene Wert ist nur im Zustand QtAudio::ActiveState oder QtAudio::IdleState gültig, ansonsten wird Null zurückgegeben.

Diese Funktion wurde in Qt 6.10 eingeführt.

Siehe auch bytesFree.

bool QAudioSink::isNull() const

Gibt true zurück, wenn die Instanz QAudioSink null ist, andernfalls gibt sie false zurück.

qint64 QAudioSink::processedUSecs() const

Gibt die Menge der verarbeiteten Audiodaten seit dem Aufruf von start() zurück (in Mikrosekunden).

void QAudioSink::reset()

Stoppt sofort die Audioausgabe und verwirft alle Audiodaten, die sich derzeit in den Puffern befinden. Alle anstehenden Audiodaten, die an QIODevice gesendet werden, werden ignoriert.

Siehe auch stop().

void QAudioSink::resume()

Setzt die Verarbeitung von Audiodaten nach einem suspend() fort.

Setzt state() auf den Zustand, den die Senke hatte, als suspend() aufgerufen wurde. Diese Funktion ist wirkungslos, wenn der Zustand der Audiosenke nicht QtAudio::SuspendedState ist.

[since 6.10] void QAudioSink::setBufferFrameCount(qsizetype value)

Setzt die Größe des Audiopuffers auf value in Frame Count.

Hinweis: Diese Funktion kann jederzeit vor start() aufgerufen werden. Nach start() werden Aufrufe dieser Funktion ignoriert. Es sollte nicht angenommen werden, dass die eingestellte Puffergröße die tatsächlich verwendete Puffergröße ist - rufen Sie bufferFrameCount() jederzeit nach start() auf, um die tatsächlich verwendete Puffergröße zurückzugeben.

Diese Funktion wurde in Qt 6.10 eingeführt.

Siehe auch bufferFrameCount() und setBufferSize.

void QAudioSink::setBufferSize(qsizetype value)

Setzt die Größe des Audiopuffers auf value in Bytes.

Hinweis: Diese Funktion kann jederzeit vor start() aufgerufen werden. Nach start() werden Aufrufe dieser Funktion ignoriert. Es sollte nicht davon ausgegangen werden, dass die eingestellte Puffergröße die tatsächlich verwendete Puffergröße ist - rufen Sie bufferSize() jederzeit nach start() auf, um die tatsächlich verwendete Puffergröße zurückzugeben.

Siehe auch bufferSize() und setBufferFrameCount.

void QAudioSink::setVolume(qreal volume)

Setzt die Ausgabelautstärke auf volume.

Die Lautstärke wird linear von 0.0 (Stille) bis 1.0 (volle Lautstärke) skaliert. Werte, die außerhalb dieses Bereichs liegen, werden geklammert.

Die Standardlautstärke ist 1.0.

Hinweis: Anpassungen der Lautstärke ändern die Lautstärke dieses Audiostroms, nicht die globale Lautstärke.

Die Lautstärkeregler der Benutzeroberfläche sollten normalerweise nicht linear skaliert werden. Die Verwendung einer logarithmischen Skala führt beispielsweise zu linearen Änderungen der wahrgenommenen Lautstärke, was ein Benutzer normalerweise von einem Lautstärkeregler erwarten würde. Siehe QtAudio::convertVolume() für weitere Einzelheiten.

Siehe auch volume().

QIODevice *QAudioSink::start()

Gibt einen Zeiger auf das interne QIODevice zurück, das verwendet wird, um Daten an den Audioausgang des Systems zu übertragen. Das Gerät ist bereits geöffnet und write() kann Daten direkt dorthin schreiben.

Hinweis: Der Zeiger wird ungültig, wenn der Stream gestoppt wird oder wenn Sie einen anderen Stream starten.

Wenn QAudioSink auf das Audiogerät des Systems zugreifen kann, gibt state() QtAudio::IdleState zurück, error() gibt QtAudio::NoError zurück und das Signal stateChanged() wird ausgegeben.

Tritt während dieses Vorgangs ein Problem auf, gibt error() QtAudio::OpenError zurück, state() gibt QtAudio::StoppedState zurück und das Signal stateChanged() wird ausgegeben.

Siehe auch QIODevice und QIODevice interface.

[since 6.11] template <typename Callback, QtAudio::if_audio_sink_callback<Callback> = true> void QAudioSink::start(Callback &&cb)

Startet die QAudioSink mit einer Callback-Funktion, die in einem Soft-Realtime-Audio-Thread aufgerufen wird. Der Callback ist eine Callable, die ein QSpan<SampleType> als Argument erhält, wobei SampleType mit dem QAudioFormat::SampleFormat des Formats von QAudioSink übereinstimmen muss. Der Bereich muss mit verschachtelten Audiodaten gefüllt werden.

Wenn der QAudioSink erfolgreich gestartet werden kann, gibt error() QtAudio::NoError zurück.

Tritt während dieses Vorgangs ein Problem auf, gibt error() QtAudio::OpenError zurück, state() gibt QtAudio::StoppedState zurück und das Signal stateChanged() wird ausgegeben.

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.

Diese Funktion wurde in Qt 6.11 eingeführt.

Siehe auch Callback interface.

void QAudioSink::start(QIODevice *device)

Startet die Übertragung von Audiodaten von device an den Audioausgang des Systems. device muss in den Modi ReadOnly oder ReadWrite geöffnet worden sein.

Wenn die QAudioSink erfolgreich Audiodaten ausgeben kann, gibt state() QtAudio::ActiveState zurück, error() gibt QtAudio::NoError zurück und das Signal stateChanged() wird ausgegeben.

Tritt während dieses Vorgangs ein Problem auf, gibt error() QtAudio::OpenError zurück, state() gibt QtAudio::StoppedState zurück und das Signal stateChanged() wird ausgegeben.

Siehe auch QIODevice und QIODevice interface.

QtAudio::State QAudioSink::state() const

Gibt den Status der Audioverarbeitung zurück.

[signal] void QAudioSink::stateChanged(QtAudio::State state)

Dieses Signal wird ausgesendet, wenn sich das Gerät state geändert hat. Dies ist der aktuelle Zustand des Audioausgangs.

Hinweis: Der QtAudio Namespace hieß bis einschließlich Qt 6.6 QAudio. String-basierte Verbindungen zu diesem Signal müssen QAudio::State als Parametertyp verwenden: connect(source, SIGNAL(stateChanged(QAudio::State)), ...);

void QAudioSink::stop()

Stoppt die Audioausgabe und trennt sich von der Systemressource.

Setzt error() auf QtAudio::NoError, state() auf QtAudio::StoppedState und gibt das Signal stateChanged() aus.

Hinweis: Unter Linux und Darwin wird bei diesem Vorgang der zugrunde liegende Audiopuffer synchron entleert, was zu entsprechenden Verzögerungen bei der Pufferauslastung führen kann. Um alle Puffer sofort zurückzusetzen, verwenden Sie stattdessen die Methode reset.

Siehe auch reset().

void QAudioSink::suspend()

Beendet die Verarbeitung von Audiodaten und bewahrt gepufferte Audiodaten.

Setzt state() auf QtAudio::SuspendedState und gibt das Signal stateChanged() aus.

qreal QAudioSink::volume() const

Liefert die Lautstärke zwischen 0,0 und 1,0 einschließlich.

Siehe auch setVolume().

© 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.