QAudioSource Class
La classe QAudioSource fournit une interface permettant de recevoir des données audio provenant d'un périphérique d'entrée audio. En savoir plus...
| En-tête : | #include <QAudioSource> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Multimedia) target_link_libraries(mytarget PRIVATE Qt6::Multimedia) |
| qmake : | QT += multimedia |
| Hérite de : | 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 |
(since 6.10) qsizetype | bufferFrameCount() const |
| 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 |
(since 6.12) qsizetype | nativePeriodFrameCount() const |
| qint64 | processedUSecs() const |
| void | reset() |
| void | resume() |
(since 6.10) void | setBufferFrameCount(qsizetype value) |
| void | setBufferSize(qsizetype value) |
(since 6.12) void | setNativePeriodFrameCount(qsizetype frameCount) |
| 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 créer une entrée audio à l'aide du périphérique d'entrée audio par défaut du système. Il est également possible de créer une instance de `QAudioSource` avec une ` QAudioDevice` spécifique. Lorsque vous créez l'entrée audio, vous devez également fournir l'` QAudioFormat ` à utiliser pour l'enregistrement (voir la description de la classe ` QAudioFormat ` pour plus de détails).
QAudioSink peut être utilisé selon deux modes différents :
- Utilisation d’un QIODevice depuis un thread d’application
- Utilisation d’une interface basée sur les callbacks depuis le thread audio
Interface QIODevice
QAudioSource vous permet d'enregistrer du son à l'aide d'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 instance de ` QAudioDevice ` correspondant à un périphérique spécifique. Vous devez également passer l'QAudioFormat auquel vous souhaitez enregistrer.
Pour lancer QAudioSource, il suffit d'appeler la méthode ` start()` avec un ` QIODevice ` ouvert en écriture. Par exemple, pour enregistrer dans un fichier, vous pouvez :
QFile destinationFile ; // Membre de classe
QAudioSource* audio ; // Membre de la classe
{
destinationFile.setFileName("/tmp/test.raw");
destinationFile.open( QIODevice::WriteOnly | QIODevice::Truncate);
QAudioFormat format;
// Configurer 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 le son pendant 3 000 ms
}Cela lancera l'enregistrement si le format spécifié est pris en charge par le périphérique d'entrée (vous pouvez le vérifier avec ` QAudioDevice::isFormatSupported()`. En cas de problème, utilisez la fonction ` error()` pour identifier l'origine du problème. L'enregistrement est arrêté dans le slot ` 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 définis par l’énumération QtAudio::State.
QAudioSource propose plusieurs moyens de mesurer le temps écoulé depuis la fonction start() de l’enregistrement. La fonction ` processedUSecs() ` renvoie la durée du flux en microsecondes écrites ; en d’autres termes, elle ne prend pas en compte les périodes pendant lesquelles l’entrée audio a été suspendue ou inactive. La fonction ` elapsedUSecs()` renvoie le temps écoulé depuis l’appel de ` start()`, quel que soit l’état dans lequel s’est trouvée la `QAudioSource`.
Modèle de threading et mise en mémoire tampon
L’interface ` QIODevice ` est conçue pour être utilisée depuis le thread de l’application. Un tampon circulaire sans attente est utilisé pour communiquer avec le thread audio. La taille de ce tampon circulaire peut être configurée à l’aide de ` setBufferSize()` et est fixée par défaut à 250 ms. L’état de ce tampon peut être interrogé via la fonction bytesFree(). Si le tampon circulaire est plein parce que l’application ne lit pas à temps les données provenant de QIODevice, l’état passe à « QtAudio::IdleState » et revient à « QtAudio::ActiveState » dès que l’application a lu les données de QIODevice. Notez que ce changement d’état entraîne la perte de données audio ; vous devez donc toujours lire les données de QIODevice aussi rapidement que possible pour éviter les pertes de signal.
Interface de rappel
La meilleure façon d’obtenir de faibles latences audio consiste à utiliser l’interface basée sur les callbacks. Elle vous permet de lire les données audio directement depuis le périphérique audio sans passer par un QIODevice. Pour ce faire, il suffit d’appeler start() avec une fonction de callback qui sera appelée depuis le thread audio. Cette fonction de rappel sera appelée avec un objet de type 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;
// Configurer le format, par ex.
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) {
// Calculer le niveau de crête à partir des échantillons audio
level = std::max(level, std::abs(sample));
}
peakLevel.store(level);
// Remarque : il faut faire attention si le thread de l'application doit être notifié, car la
// fonction de rappel audio ne doit pas utiliser d'appels système susceptibles de bloquer le système.
// Les options recommandées sont les événements à réinitialisation automatique (Windows), eventfd (Linux) ou kqueue/EVFILT_USER sur macOS.
});
if (!audio->error()== QtAudio::Error::NoError) {
// Outre les autres signatures de la fonction start(), le lancement de la fonction de rappel audio échouera si
// * le backend n’implémente pas d’E/S basées sur des fonctions de rappel (l’API est disponible sur toutes les principales
// plateformes)
// * la signature de la fonction de rappel audio ne correspond pas à celle renvoyée par format.sampleFormat()
qWarning() << "Error starting audio output:" << audio->errorString();
}
}Contrairement à l'interface basée sur ` QIODevice`, `QAudioSource` ne peut se trouver que dans les états « active », « suspended » et « stopped ». L'API ` setBufferSize()` n'est pas disponible lors de l'utilisation de la fonction de rappel ; la taille de l'argument de la fonction de rappel est déterminée par le backend audio.
Remarque : cette API n’est disponible que sur les plateformes prenant en charge l’API de rappel : CoreAudio d’Apple (macOS, iOS, etc.), Windows, Linux (utilisant le backend PulseAudio ou PipeWire) et Android.
Remarque : la fonction de rappel sera appelée sur un thread audio en temps réel « souple ». Il est important de s'assurer que la fonction de rappel ne bloque pas, car cela peut entraîner des perturbations audio ou des coupures. Cela inclut l'exécution d'opérations d'E/S bloquantes, le verrouillage de mutex, l'allocation de mémoire ou toute autre opération susceptible de bloquer le système. Pour connaître les meilleures pratiques, consultez l’article de Ross Bencina intitulé « Real-time audio programming 101: time waits for nothing ». Envisagez également d’utiliser le « Realtime sanitizer » de clang pour valider la fonction de rappel audio.
Gestion de l'état et des erreurs
Les changements d’état sont signalés via le signal ` stateChanged()`. Vous pouvez demander un changement d’état directement via les fonctions ` suspend()`, ` resume()`, ` stop()`, ` reset()` et ` start()`.
error type La classe `QAudioSource` passe à l’état « StoppedState » lorsqu’une erreur survient. L’état « » peut être récupéré via la fonction ` error()`. Veuillez consulter l’énumération ` QtAudio::Error ` pour obtenir une description des erreurs possibles qui sont signalées. L’appel de ` stop()` ou de ` 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)
Créez une nouvelle entrée audio et associez-la à ` 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)
Créez une nouvelle entrée audio et associez-la à parent. Le périphérique référencé par audioDevice est utilisé avec les paramètres d'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()
Supprimez cette entrée audio.
[since 6.10] qsizetype QAudioSource::bufferFrameCount() const
Renvoie la taille du tampon audio en trames.
Si elle est appelée avant ` start()`, elle renvoie la valeur par défaut de la plateforme. Si elle est appelée avant ` start() `, mais que ` setBufferSize()` ou ` setBufferFrameCount()` a été appelée auparavant, elle renvoie la valeur définie par ` setBufferSize() ` ou ` setBufferFrameCount()`. Si elle est appelée après ` start()`, elle renvoie la taille réelle du tampon actuellement utilisé. Celle-ci peut ne pas correspondre à la valeur précédemment définie par ` setBufferSize() ` ou ` setBufferFrameCount()`.
Cette fonction a été introduite dans Qt 6.10.
Voir également setBufferFrameCount() et bufferSize.
qsizetype QAudioSource::bufferSize() const
Renvoie la taille du tampon audio en octets.
Si la fonction 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ée auparavant, elle renvoie la valeur définie par setBufferSize() ou setBufferFrameCount(). Si elle est appelée après start(), elle renvoie la taille réelle du tampon actuellement utilisé. Celle-ci peut ne pas correspondre à la valeur précédemment définie par setBufferSize() ou setBufferFrameCount().
Voir également setBufferSize() et bufferFrameCount.
qsizetype QAudioSource::bytesAvailable() const
Renvoie la quantité de données audio disponibles pour la lecture, en octets.
Remarque : la valeurrenvoyée n'est valide que lorsque la fonction est dans l'état « QtAudio::ActiveState » ou « QtAudio::IdleState » ; dans le cas contraire, elle renvoie zéro.
Voir également framesAvailable.
qint64 QAudioSource::elapsedUSecs() const
Renvoie le nombre de microsecondes écoulées depuis l'appel de la fonction start(), y compris le temps passé dans les états « Idle » et « Suspend ».
QtAudio::Error QAudioSource::error() const
Renvoie l'état d'erreur.
QAudioFormat QAudioSource::format() const
Renvoie l'QAudioFormat e actuellement utilisé.
[since 6.10] qsizetype QAudioSource::framesAvailable() const
Renvoie la quantité de données audio disponibles pour la lecture, exprimée en trames.
Remarque : la valeur renvoyée n’est valide que lorsque la fonction est dans l’état « QtAudio::ActiveState » ou « QtAudio::IdleState » ; dans le cas contraire, elle renvoie zéro.
Cette fonction a été introduite dans Qt 6.10.
Voir également bytesAvailable.
bool QAudioSource::isNull() const
Renvoie « true » si la source audio est « null », sinon renvoie « false ».
[since 6.12] qsizetype QAudioSource::nativePeriodFrameCount() const
Renvoie le nombre de trames de période natif.
Renvoie -1 si la valeur n'est pas définie, sinon renvoie la valeur précédemment définie avec la fonction setNativePeriodFrameCount().
Cette fonction a été introduite dans Qt 6.12.
Voir aussi setNativePeriodFrameCount.
qint64 QAudioSource::processedUSecs() const
Renvoie, en microsecondes, la quantité de données audio traitées depuis l'appel de la fonction start().
void QAudioSource::reset()
Supprime toutes les données audio contenues dans les tampons et remet les tampons à zéro.
void QAudioSource::resume()
Reprend le traitement des données audio après l'appel de la fonction suspend().
Rétablit l’état de la fonction ` state()` tel qu’il était au moment de l’appel de ` suspend()`. Cette fonction ne fait rien si l’état du périphérique de sortie audio n’est pas ` QtAudio::SuspendedState`.
[since 6.10] void QAudioSource::setBufferFrameCount(qsizetype value)
Définit la taille du tampon audio à value en nombre d'images.
Remarque : cette fonction peut être appelée à tout moment avant l'appel de ` start()`. Les appels à cette fonction sont ignorés après l'appel de ` start()`. Il ne faut pas supposer que la taille de tampon définie correspond à la taille de tampon réellement utilisée : appelez ` bufferFrameCount()` à tout moment après l'appel de ` start()` pour obtenir la taille de tampon réellement utilisée.
Les propriétés bufferFrameCount() et bufferSize() indiquent la taille du tampon circulaire lors de l’utilisation des API QIODevice. La taille native de la période est contrôlée via setNativePeriodFrameCount().
Cette fonction a été introduite dans Qt 6.10.
Voir également bufferFrameCount() et setBufferSize.
void QAudioSource::setBufferSize(qsizetype value)
Définit la taille du tampon audio à value octets.
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 tampon définie correspond à la taille de tampon réellement utilisée ; l'appel de ` bufferSize()` à tout moment après ` start()` renverra la taille de tampon réellement utilisée.
Les propriétés bufferFrameCount() et bufferSize() indiquent la taille du tampon circulaire lors de l’utilisation des API QIODevice. La taille native de la période est contrôlée via setNativePeriodFrameCount().
Voir également bufferSize() et setBufferFrameCount.
[since 6.12] void QAudioSource::setNativePeriodFrameCount(qsizetype frameCount)
Définit le nombre de trames par période native à frameCount.
Règle la taille de la mémoire tampon audio utilisée par le système d’exploitation et le matériel. Par défaut (lorsque ce paramètre n’est pas défini), le système utilise une valeur dépendante de la plate-forme, généralement 1 024 trames (~23 ms à 44 100 Hz).
Utilisez des valeurs plus petites (64 à 256) pour réduire la latence, ou des valeurs plus grandes (2048 à 4096) pour réduire le risque de débordement de tampon (pertes de données).
Les valeurs valides sont des puissances de 2 comprises entre 32 et 4 096 (inclus), ou -1 pour désactiver le paramètre. Ne peut être appelé que lorsque la source audio est arrêtée.
Correspond aux paramètres spécifiques à chaque plateforme : kAudioDevicePropertyBufferFrameSize (macOS), IAudioClient::bufferDuration (Windows), PW_KEY_NODE_FORCE_QUANTUM (PipeWire/Linux) et AAudioStreamBuilder_setBufferCapacityInFrames (Android).
Remarque : ceci est distinct du tampon circulaire configuré avec setBufferSize() ou setBufferFrameCount().
Cette fonction a été introduite dans Qt 6.12.
Voir également nativePeriodFrameCount.
void QAudioSource::setVolume(qreal volume)
Règle le volume d'entrée sur volume.
Le volume est mis à l'échelle de manière linéaire entre 0.0 (silence) et 1.0 (volume maximal). Les valeurs situées en dehors de cette plage seront limitées.
Si l'appareil ne prend pas en charge le réglage du volume d'entrée, la valeur volume sera ignorée et le volume d'entrée restera à 1,0.
Le volume par défaut est 1.0.
Remarque : les réglages du volume modifient le volume de ce flux audio, et non le volume global.
Voir également volume().
QIODevice *QAudioSource::start()
Renvoie un pointeur vers l'QIODevice interne utilisée pour transférer les données provenant de l'entrée audio du système. Le périphérique sera déjà ouvert et la fonction read() pourra y lire directement les données.
Remarque : le pointeur deviendra invalide une fois le flux arrêté ou si vous lancez un autre flux.
Si l'QAudioSource est en mesure d'accéder au périphérique audio du système, la fonction state() renvoie QtAudio::IdleState, la fonction error() renvoie QtAudio::NoError et le signal stateChanged() est émis.
Si un problème survient au cours de ce processus, la fonction error() renvoie QtAudio::OpenError, la fonction state() renvoie QtAudio::StoppedState et le signal stateChanged() est émis.
Voir également QIODevice et QIODevice interface.
[since 6.11] template <typename Callback> requires QtAudio::if_audio_source_callback<Callback> void QAudioSource::start(Callback &&cb)
Lance l'QAudioSource avec une fonction de rappel qui sera appelée sur un thread audio en temps réel souple. La fonction de rappel est un objet « callable » qui prend en argument un objet de type QSpan<const SampleType> ; le type SampleType doit correspondre à l'QAudioFormat::SampleFormat du format de l'QAudioSource. L'objet span contient les données audio entrelacées.
Si l’ QAudioSource e parvient à démarrer correctement, la fonction error() renvoie QtAudio::NoError.
Si un problème survient au cours de ce processus, la fonction ` error()` renvoie ` QtAudio::OpenError`, la fonction ` state()` renvoie ` QtAudio::StoppedState ` et le signal ` stateChanged()` est émis.
Remarque : cette API n’est disponible que sur les plateformes prenant en charge l’API de rappel : CoreAudio d’Apple (macOS, iOS, etc.), Windows, Linux (utilisant le backend PulseAudio ou PipeWire) et Android.
Remarque : la fonction de rappel sera appelée sur un thread audio en temps réel souple. Il est important de s’assurer que la fonction de rappel ne bloque pas, car cela peut provoquer des perturbations audio ou des coupures. Cela inclut l’exécution d’opérations d’E/S bloquantes, le verrouillage de mutex, l’allocation de mémoire ou toute autre opération susceptible de bloquer le système. Pour connaître les bonnes pratiques, consultez l’article de Ross Bencina intitulé « Real-time audio programming 101: time waits for nothing ». Envisagez également d’utiliser le « Realtime Sanitizer » de Clang pour valider la fonction de rappel audio.
Cette fonction a été introduite dans Qt 6.11.
Voir également Callback interface.
void QAudioSource::start(QIODevice *device)
Lance le transfert des données audio depuis l'entrée audio du système vers l'device. L'device doit avoir été ouvert en mode « WriteOnly », « Append » ou « ReadWrite ».
Si le QAudioSource parvient à récupérer les données audio, state() renvoie soit QtAudio::ActiveState, soit 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 l'state de l'appareil a changé.
Remarque : l'espace de noms « QtAudio » s'appelait « QAudio » jusqu'à la version Qt 6.6 incluse. Les connexions basées sur des chaînes de caractères à ce signal doivent utiliser « QAudio::State » comme type de paramètre : connect(source, SIGNAL(stateChanged(QAudio::State)), ...);
void QAudioSource::stop()
Arrête l'entrée audio et se déconnecte de la ressource système.
Définit error() sur QtAudio::NoError, state() sur QtAudio::StoppedState et émet le signal stateChanged().
void QAudioSource::suspend()
Arrête le traitement des données audio tout en conservant 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 prend pas en charge le réglage du volume d'entrée, la valeur renvoyée sera 1,0.
Voir également 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.