Auf dieser Seite

QAudioSource Class

Die Klasse QAudioSource bietet eine Schnittstelle für den Empfang von Audiodaten von einem Audio-Eingabegerät. Mehr...

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

Öffentliche Funktionen

QAudioSource(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
QAudioSource(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
virtual ~QAudioSource() override
qsizetype bufferFrameCount() const
(since 6.10) qsizetype bufferSize() const
qsizetype bytesAvailable() const
qint64 elapsedUSecs() const
QtAudio::Error error() const
QAudioFormat format() const
(since 6.10) qsizetype framesAvailable() const
bool isNull() const
qint64 processedUSecs() const
void reset()
void resume()
void setBufferFrameCount(qsizetype value)
(since 6.10) 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 Audioeingang mit dem Standard-Audioeingangsgerät des Systems erstellen. Es ist auch möglich, QAudioSource mit einem bestimmten QAudioDevice zu erstellen. Wenn Sie den Audioeingang erstellen, sollten Sie auch die QAudioFormat für die Aufnahme verwenden (siehe die QAudioFormat Klassenbeschreibung für Details).

QAudioSink kann in zwei verschiedenen Modi verwendet werden:

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

QIODevice-Schnittstelle

Mit QAudioSource können Sie Audio mit einem Audio-Eingabegerät aufnehmen. Der Standardkonstruktor dieser Klasse verwendet das Standard-Audiogerät des Systems, aber Sie können auch ein QAudioDevice für ein bestimmtes Gerät angeben. Sie müssen auch die QAudioFormat übergeben, in der Sie aufnehmen möchten.

Um die QAudioSource zu starten, müssen Sie lediglich start() mit einem zum Schreiben geöffneten QIODevice aufrufen. Um zum Beispiel in eine Datei aufzunehmen, können Sie:

QFile destinationFile; // KlassenmitgliedQAudioSource* audio; // Klassenmitglied{ destinationFile.setFileName("/tmp/test.raw"); destinationFile.open( QIODevice::WriteOnly | QIODevice::Truncate );  QAudioFormat format; // Einstellen des gewünschten Formats, zum Beispiel:format.setSampleRate(44100); format.setChannelCount(1); format.setSampleFormat(QAudioFormat::Int16);    QAudioDevice info = QMediaDevices::defaultAudioInput(); if (!info.isFormatSupported(format)) {        qWarning() << "Default format not supported, trying to use the nearest.";
    } audio = new QAudioSource(format, this); connect(audio, &QAudioSource::stateChanged, this, &AudioInputExample::handleStateChanged);    QTimer::singleShot(3000, this, &AudioInputExample::stopRecording);  audio->start(&destinationFile); // Nimmt Audio für 3000ms auf}

Die Aufnahme wird gestartet, wenn das angegebene Format vom Eingabegerät unterstützt wird (Sie können dies mit QAudioDevice::isFormatSupported() überprüfen). Falls es irgendwelche Probleme gibt, können Sie mit der Funktion error() überprüfen, was schief gelaufen ist. Wir beenden die Aufzeichnung im Slot stopRecording().

void AudioInputExample::stopRecording()
{
    audio->stop();
    destinationFile.close();
    delete audio;
}

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

QAudioSource bietet mehrere Möglichkeiten, die Zeit zu messen, die seit dem start() der Aufnahme vergangen ist. Die Funktion processedUSecs() gibt die Länge des Streams in geschriebenen Mikrosekunden zurück, d.h. sie lässt die Zeiten aus, in denen die Audioeingabe angehalten oder im Leerlauf war. Die Funktion elapsedUSecs() gibt die Zeit zurück, die seit dem Aufruf von start() verstrichen ist, unabhängig davon, in welchem Zustand sich die QAudioSource befunden hat.

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 voll ist, weil die Anwendung nicht rechtzeitig aus dem QIODevice liest, wechselt der Zustand zu QtAudio::IdleState und wird wieder zu QtAudio::ActiveState, sobald die Anwendung Daten aus dem QIODevice gelesen hat. Beachten Sie, dass dieser Zustandswechsel Audiodaten fallen lässt, daher sollten Sie immer so schnell wie möglich aus dem QIODevice lesen, um Aussetzer zu vermeiden.

Callback-Schnittstelle

Der bevorzugte Weg, um niedrige Audio-Latenzen zu erreichen, ist die Verwendung der Callback-basierten Schnittstelle. Sie ermöglicht es Ihnen, Audiodaten direkt vom Audiogerät zu lesen, ohne eine 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<const SampleType> aufgerufen, sobald das Audio-Backend Daten produziert.

QAudioSource* audio; // Klassenmitglied.std::atomic<float> peakLevel; // 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 capture audio.";
       return; } audio = new QAudioSource(format, this);  audio->start([&peakLevel] (QSpan<float> interleavedAudioBuffer) { float level = peakLevel.load(); for(float sample : interleavedAudioBuffer) { // Berechnung des Spitzenpegels aus den Audio-Sampleslevel = std::max(level, std::abs(sample)); } peakLevel.store(level); // Hinweis: Wenn der Anwendungsthread benachrichtigt werden muss, ist Vorsicht geboten, da der // Audio-Callback keine potenziell blockierenden Systemaufrufe verwenden sollte.
       // Gute Optionen sind autoreset events (windows), eventfd (linux) oder kqueue/EVFILT_USER auf macos.}); 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 die QAudioSource 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 durch das 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 über das Signal stateChanged() gemeldet. Sie können eine Zustandsänderung direkt über suspend(), resume(), stop(), reset() und start() anfordern.

Wenn ein Fehler auftritt, geht die QAudioSource in den Zustand StoppedState über. Die Funktion error type kann über 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.

void AudioInputExample::handleStateChanged(QtAudio::State newState)
{
    switch (newState) {
        case QtAudio::StoppedState:
            if (audio->error() != QtAudio::NoError) {
                // Error handling
            } else {
                // Finished recording
            }
            break;

        case QtAudio::ActiveState:
            // Started recording - read from IO device
            break;

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

Siehe auch QAudioSink und QAudioDevice.

Dokumentation der Mitgliederfunktionen

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

Konstruieren Sie einen neuen Audioeingang und schließen Sie ihn an parent an. Das Standard-Audioeingabegerä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] QAudioSource::QAudioSource(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)

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

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

Zerstören Sie diesen Audioeingang.

qsizetype QAudioSource::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.

Siehe auch setBufferFrameCount() und bufferSize.

[since 6.10] qsizetype QAudioSource::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.

Diese Funktion wurde in Qt 6.10 eingeführt.

Siehe auch setBufferSize() und bufferFrameCount.

qsizetype QAudioSource::bytesAvailable() const

Gibt die Menge der zum Lesen verfügbaren Audiodaten in 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 framesAvailable.

qint64 QAudioSource::elapsedUSecs() const

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

QtAudio::Error QAudioSource::error() const

Gibt den Fehlerstatus zurück.

QAudioFormat QAudioSource::format() const

Gibt die QAudioFormat zurück, die verwendet wird.

[since 6.10] qsizetype QAudioSource::framesAvailable() const

Gibt die Menge der zum Lesen verfügbaren Audiodaten in Frames zurück.

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

bool QAudioSource::isNull() const

Gibt true zurück, wenn die Audioquelle null ist, andernfalls wird false zurückgegeben.

qint64 QAudioSource::processedUSecs() const

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

void QAudioSource::reset()

Verwirft alle Audiodaten in den Puffern, setzt die Puffer auf Null zurück.

void QAudioSource::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.

void QAudioSource::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.

Siehe auch bufferFrameCount() und setBufferSize.

[since 6.10] void QAudioSource::setBufferSize(qsizetype value)

Setzt die Größe des Audiopuffers auf value bytes.

Hinweis: Diese Funktion kann jederzeit vor start() aufgerufen werden, Aufrufe nach start() werden ignoriert. Es sollte nicht davon ausgegangen werden, dass die eingestellte Puffergröße die tatsächlich verwendete Puffergröße ist. Der Aufruf von bufferSize() zu einem beliebigen Zeitpunkt nach start() gibt die tatsächlich verwendete Puffergröße zurück.

Diese Funktion wurde in Qt 6.10 eingeführt.

Siehe auch bufferSize() und setBufferFrameCount.

void QAudioSource::setVolume(qreal volume)

Setzt die Eingangslautstä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.

Wenn das Gerät die Einstellung der Eingangslautstärke nicht unterstützt, wird volume ignoriert und die Eingangslautstärke bleibt bei 1,0.

Die Standardlautstärke ist 1.0.

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

Siehe auch volume().

QIODevice *QAudioSource::start()

Gibt einen Zeiger auf das interne QIODevice zurück, das zur Übertragung von Daten vom Audioeingang des Systems verwendet wird. Das Gerät ist bereits geöffnet und read() kann Daten direkt von ihm lesen.

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

Wenn QAudioSource 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_source_callback<Callback> = true> void QAudioSource::start(Callback &&cb)

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

Wenn der QAudioSource 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 QAudioSource::start(QIODevice *device)

Startet die Übertragung von Audiodaten vom Audioeingang des Systems an device. device muss in den Modi WriteOnly, Append oder ReadWrite geöffnet worden sein.

Wenn QAudioSource erfolgreich Audiodaten abrufen kann, gibt state() entweder QtAudio::ActiveState oder 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.

QtAudio::State QAudioSource::state() const

Gibt den Status der Audioverarbeitung zurück.

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

Dieses Signal wird ausgegeben, wenn sich das Gerät state geändert hat.

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 QAudioSource::stop()

Stoppt den Audioeingang und trennt sich von der Systemressource.

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

void QAudioSource::suspend()

Beendet die Verarbeitung von Audiodaten und bewahrt gepufferte Audiodaten.

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

qreal QAudioSource::volume() const

Gibt die Eingangslautstärke zurück.

Wenn das Gerät die Einstellung der Eingangslautstärke nicht unterstützt, ist der zurückgegebene Wert 1.0.

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.