Sur cette page

QAudioSource Class

La classe QAudioSource fournit une interface pour la réception de données audio provenant d'un périphérique d'entrée audio. Plus d'informations...

En-tête : #include <QAudioSource>
CMake : find_package(Qt6 REQUIRED COMPONENTS Multimedia)
target_link_libraries(mytarget PRIVATE Qt6::Multimedia)
qmake : QT += multimedia
Hérite : QObject

Fonctions publiques

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

Signaux

void stateChanged(QtAudio::State state)

Description détaillée

Vous pouvez construire une entrée audio avec le périphérique d'entrée audio par défaut du système. Il est également possible de créer un QAudioSource avec un QAudioDevice spécifique. Lorsque vous créez l'entrée audio, vous devez également envoyer le QAudioFormat à utiliser pour l'enregistrement (voir la description de la classe QAudioFormat pour plus de détails).

QAudioSink QAudioSource peut être utilisé dans deux modes différents :

  • Utilisation de QIODevice à partir d'un thread d'application
  • Utilisation d'une interface basée sur des rappels à partir du fil d'exécution audio

Interface QIODevice

QAudioSource vous permet d'enregistrer de l'audio avec un périphérique d'entrée audio. Le constructeur par défaut de cette classe utilise le périphérique audio par défaut du système, mais vous pouvez également spécifier une adresse QAudioDevice pour un périphérique spécifique. Vous devez également transmettre le QAudioFormat dans lequel vous souhaitez enregistrer.

Le démarrage de QAudioSource consiste simplement à appeler start() avec un QIODevice ouvert à l'écriture. Par exemple, pour enregistrer dans un fichier, vous pouvez :

QFile destinationFile ; // Membre de la classeQAudioSource* audio ; // Membre de la classe{ destinationFile.setFileName("/tmp/test.raw") ; destinationFile.open( QIODevice::WriteOnly | :: Truncate QIODevice::Truncate ) ; QAudioFormat format ; // Configure le format souhaité, par exemple :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) ; // Enregistre l'audio pendant 3000ms}

L'enregistrement démarre si le format spécifié est pris en charge par le périphérique d'entrée (vous pouvez le vérifier à l'aide de QAudioDevice::isFormatSupported(). En cas de problème, utilisez la fonction error() pour vérifier ce qui n'a pas fonctionné. Nous arrêtons l'enregistrement à l'emplacement stopRecording().

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

À tout moment, QAudioSource se trouve dans l'un des quatre états suivants : actif, suspendu, arrêté ou inactif. Ces états sont spécifiés par l'enum QtAudio::State.

QAudioSource fournit plusieurs moyens de mesurer le temps écoulé depuis le start() de l'enregistrement. La fonction processedUSecs() renvoie la longueur du flux en microsecondes écrites, c'est-à-dire qu'elle ne tient pas compte des moments où l'entrée audio a été suspendue ou inactive. La fonction elapsedUSecs() renvoie le temps écoulé depuis que start() a été appelée, quels que soient les états dans lesquels la QAudioSource s'est trouvée.

Modèle de filtrage et mise en mémoire tampon

L'interface QIODevice est conçue pour être utilisée à partir du fil d'exécution de l'application. Un tampon circulaire sans attente est utilisé pour communiquer avec le thread audio. La taille de cette mémoire tampon peut être configurée avec setBufferSize() et est par défaut de 250 ms. L'état de ce tampon peut être interrogé avec bytesFree(). Si le tampon circulaire est plein parce que l'application ne lit pas à temps à partir de QIODevice, l'état passera à QtAudio::IdleState et reprendra à QtAudio::ActiveState une fois que l'application aura lu les données à partir de QIODevice. Notez que ce changement d'état fera tomber les données audio, vous devez donc toujours lire à partir de QIODevice aussi vite que possible pour éviter les chutes.

Interface de rappel

La meilleure façon d'obtenir de faibles latences audio est d'utiliser l'interface basée sur le rappel. Elle vous permet de lire les données audio directement à partir du périphérique audio sans avoir à passer par QIODevice. Cela se fait en appelant start() avec une fonction de rappel qui sera appelée à partir du thread audio. Cette fonction de rappel sera appelée avec un QSpan<const SampleType> chaque fois que le backend audio produira des données.

QAudioSource* audio ; // membre de la classe.std::atomic<float> peakLevel ; // membre de la classe.{ QAudioFormat format ; // Configure le format, par exempleformat.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) { // Calculer le niveau de crête à partir des échantillons audiolevel = std::max(level, std::abs(sample)) ; } peakLevel.store(level) ; // Note : il faut faire attention si le thread de l'application doit être notifié, car le // callback audio ne doit pas utiliser d'appels système potentiellement bloquants.
        //  De bonnes options sont autoreset events (windows), eventfd (linux) ou kqueue/EVFILT_USER sur macos.}) ; if (!audio->error() == QtAudio::Error::NoError) { // en plus des autres signatures de start(), le démarrage du callback audio échouera si // * le backend n'implémente pas l'IO basé sur le callback (l'API est disponible sur toutes les // plateformes  majeures ) // * la signature du callback audio ne correspond pas à format.sampleFormat()
        qWarning() << "Error starting audio output:" << audio->errorString();
    } }

Contrairement à l'interface basée sur QIODevice, la QAudioSource ne peut être que dans les états actif, suspendu et arrêté. L'API setBufferSize() n'est pas disponible lors de l'utilisation du callback, la taille de l'argument du callback est déterminée par le backend audio.

Remarque : cette API n'est disponible que sur les plateformes qui prennent en charge l'API de rappel : CoreAudio d'Apple (macOS, iOS, etc.), Windows, Linux (en utilisant le backend PulseAudio ou PipeWire) et Android.

Note : Le callback sera appelé sur un thread audio en temps réel. Il est important de s'assurer que le callback ne se bloque pas, car cela peut entraîner des problèmes audio ou des interruptions. Cela inclut l'exécution d'entrées-sorties bloquantes, le verrouillage de mutex, l'allocation de mémoires ou toute autre opération susceptible de bloquer. Pour les meilleures pratiques, consultez l'article de Ross Bencina Real-time audio programming 101 : time waits for nothing (Programmation audio en temps réel 101 : le temps n'attend rien). Pensez également à utiliser l'assainisseur temps réel de clang pour valider le callback audio.

Gestion de l'état et des erreurs

Les changements d'état sont signalés par le signal stateChanged(). Vous pouvez demander un changement d'état directement via suspend(), resume(), stop(), reset(), et start().

Le QAudioSource entrera dans le StoppedState lorsqu'une erreur est rencontrée. La fonction error type peut être récupérée par la fonction error(). Veuillez consulter l'énumération QtAudio::Error pour une description des erreurs possibles qui sont signalées. L'appel à stop() ou reset() réinitialise l'état d'erreur à NoError.

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;
    }
}

Voir également QAudioSink et QAudioDevice.

Documentation sur les fonctions membres

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

Construire une nouvelle entrée audio et l'attacher à parent. Le périphérique d'entrée audio par défaut est utilisé avec les paramètres de sortie format. Si format est initialisé par défaut, le format sera défini sur le format préféré du périphérique audio.

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

Construire une nouvelle entrée audio et l'attacher à parent. Le périphérique référencé par audioDevice est utilisé avec les paramètres de l'entrée format. Si format est initialisé par défaut, le format sera défini sur le format préféré de audioDevice.

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

Détruire cette entrée audio.

qsizetype QAudioSource::bufferFrameCount() const

Renvoie la taille du tampon audio en images.

Si elle est appelée avant start(), elle renvoie la valeur par défaut de la plate-forme. Si elle est appelée avant start() mais que setBufferSize() ou setBufferFrameCount() a été appelé avant, elle renvoie la valeur définie par setBufferSize() ou setBufferFrameCount(). Si elle est appelée après start(), elle renvoie la taille réelle de la mémoire tampon utilisée. Cette valeur peut être différente de celle définie précédemment par setBufferSize() ou setBufferFrameCount().

Voir également setBufferFrameCount() et bufferSize.

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

Renvoie la taille du tampon audio en octets.

Si elle est appelée avant start(), elle renvoie la valeur par défaut de la plate-forme. Si elle est appelée avant start() mais que setBufferSize() ou setBufferFrameCount() a été appelé avant, elle renvoie la valeur définie par setBufferSize() ou setBufferFrameCount(). Si elle est appelée après start(), elle renvoie la taille réelle de la mémoire tampon utilisée. Cette valeur peut être différente de celle définie précédemment par setBufferSize() ou setBufferFrameCount().

Cette fonction a été introduite dans Qt 6.10.

Voir aussi setBufferSize() et bufferFrameCount.

qsizetype QAudioSource::bytesAvailable() const

Renvoie la quantité de données audio disponibles à la lecture en octets.

Remarque : la valeur renvoyée n'est valable que dans l'état QtAudio::ActiveState ou QtAudio::IdleState, sinon la valeur renvoyée est zéro.

Voir aussi framesAvailable.

qint64 QAudioSource::elapsedUSecs() const

Renvoie les microsecondes écoulées depuis l'appel de start(), y compris le temps passé en état de veille et de suspension.

QtAudio::Error QAudioSource::error() const

Renvoie l'état d'erreur.

QAudioFormat QAudioSource::format() const

Renvoie l'adresse QAudioFormat utilisée.

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

Renvoie la quantité de données audio disponibles pour la lecture en images.

Remarque : la valeur renvoyée n'est valable que dans l'état QtAudio::ActiveState ou QtAudio::IdleState, sinon elle renvoie zéro.

Cette fonction a été introduite dans Qt 6.10.

Voir aussi bytesAvailable.

bool QAudioSource::isNull() const

Renvoie true si la source audio est null, sinon renvoie false.

qint64 QAudioSource::processedUSecs() const

Renvoie la quantité de données audio traitées depuis que start() a été appelé, en microsecondes.

void QAudioSource::reset()

Abandonne toutes les données audio dans les tampons, remet les tampons à zéro.

void QAudioSource::resume()

Reprend le traitement des données audio après un appel à suspend().

Fixe state() à l'état que le récepteur avait lorsque suspend() a été appelé. Cette fonction ne fait rien si l'état du récepteur audio n'est pas QtAudio::SuspendedState.

void QAudioSource::setBufferFrameCount(qsizetype value)

Définit la taille de la mémoire tampon audio à value en nombre d'images.

Remarque : cette fonction peut être appelée à tout moment avant start(). Les appels à cette fonction sont ignorés après start(). Il ne faut pas supposer que la taille de la mémoire tampon définie est la taille réelle de la mémoire tampon utilisée - appelez bufferFrameCount() n'importe quand après start() pour renvoyer la taille réelle de la mémoire tampon utilisée.

Voir aussi bufferFrameCount() et setBufferSize.

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

Fixe la taille de la mémoire tampon audio à value bytes.

Remarque : cette fonction peut être appelée à tout moment avant start() ; les appels à cette fonction sont ignorés après start(). Il ne faut pas supposer que la taille de la mémoire tampon définie est la taille réelle de la mémoire tampon utilisée, l'appel de bufferSize() à tout moment après start() renverra la taille réelle de la mémoire tampon utilisée.

Cette fonction a été introduite dans Qt 6.10.

Voir aussi bufferSize() et setBufferFrameCount.

void QAudioSource::setVolume(qreal volume)

Règle le volume d'entrée sur volume.

Le volume est échelonné linéairement de 0.0 (silence) à 1.0 (plein volume). Les valeurs en dehors de cette plage seront bloquées.

Si l'appareil ne permet pas de régler le volume d'entrée, volume sera ignoré et le volume d'entrée restera à 1,0.

Le volume par défaut est 1.0.

Remarque : les ajustements du volume modifieront le volume de ce flux audio, et non le volume global.

Voir aussi volume().

QIODevice *QAudioSource::start()

Renvoie un pointeur vers l'adresse interne QIODevice utilisée pour transférer les données de l'entrée audio du système. Le périphérique sera déjà ouvert et read() pourra lire les données directement à partir de celui-ci.

Remarque : le pointeur deviendra invalide après l'arrêt du flux ou si vous démarrez un autre flux.

Si QAudioSource peut accéder au périphérique audio du système, state() renvoie QtAudio::IdleState, error() renvoie QtAudio::NoError et le signal stateChanged() est émis.

Si un problème survient au cours de ce processus, error() renvoie QtAudio::OpenError, state() renvoie QtAudio::StoppedState et le signal stateChanged() est émis.

Voir également QIODevice et QIODevice interface.

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

Démarre le QAudioSource avec une fonction de rappel qui sera appelée sur un thread audio en temps réel. La fonction de rappel est un appelable qui prend en argument QSpan<const SampleType>, SampleType devant correspondre à QAudioFormat::SampleFormat du format de QAudioSource. Le span contient les données audio entrelacées.

Si QAudioSource est capable de démarrer avec succès, error() renvoie QtAudio::NoError.

Si un problème survient au cours de ce processus, error() renvoie QtAudio::OpenError, state() renvoie QtAudio::StoppedState et le signal stateChanged() est émis.

Remarque : cette API n'est disponible que sur les plateformes qui prennent en charge l'API de rappel : CoreAudio d'Apple (macOS, iOS, etc.), Windows, Linux (en utilisant le backend PulseAudio ou PipeWire) et Android.

Note : Le callback sera appelé sur un thread audio en temps réel. Il est important de s'assurer que le callback ne se bloque pas, car cela peut entraîner des problèmes audio ou des interruptions. Cela inclut l'exécution d'entrées-sorties bloquantes, le verrouillage de mutex, l'allocation de mémoires ou toute autre opération susceptible de bloquer. Pour les meilleures pratiques, consultez l'article de Ross Bencina Real-time audio programming 101 : time waits for nothing (Programmation audio en temps réel 101 : le temps n'attend rien). Pensez aussi à utiliser le Realtime sanitizer de clang pour valider le callback audio.

Cette fonction a été introduite dans Qt 6.11.

Voir aussi Callback interface.

void QAudioSource::start(QIODevice *device)

Commence à transférer les données audio de l'entrée audio du système vers le site device. Le site device doit avoir été ouvert dans les modes WriteOnly, Append ou ReadWrite.

Si QAudioSource parvient à obtenir des données audio, state() renvoie QtAudio::ActiveState ou QtAudio::IdleState, error() renvoie QtAudio::NoError et le signal stateChanged() est émis.

Si un problème survient au cours de ce processus, error() renvoie QtAudio::OpenError, state() renvoie QtAudio::StoppedState et le signal stateChanged() est émis.

Voir également QIODevice et QIODevice interface.

QtAudio::State QAudioSource::state() const

Renvoie l'état du traitement audio.

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

Ce signal est émis lorsque le périphérique state a changé.

Remarque : l'espace de noms QtAudio était nommé QAudio jusqu'à la version 6.6 de Qt incluse. Les connexions à ce signal basées sur des chaînes de caractères doivent utiliser QAudio::State comme type de paramètre : connect(source, SIGNAL(stateChanged(QAudio::State)), ...);

void QAudioSource::stop()

Arrête l'entrée audio, en se détachant de la ressource système.

Définit error() en QtAudio::NoError, state() en QtAudio::StoppedState et émet le signal stateChanged().

void QAudioSource::suspend()

Arrête le traitement des données audio, en préservant les données audio mises en mémoire tampon.

Définit error() sur QtAudio::NoError, state() sur QtAudio::SuspendedState et émet le signal stateChanged().

qreal QAudioSource::volume() const

Renvoie le volume d'entrée.

Si l'appareil ne permet pas de régler le volume d'entrée, la valeur renvoyée sera 1.0.

Voir aussi 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.