QAudioSource Class
La clase QAudioSource proporciona una interfaz para recibir datos de audio desde un dispositivo de entrada de audio. Más...
| Cabecera: | #include <QAudioSource> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Multimedia)target_link_libraries(mytarget PRIVATE Qt6::Multimedia) |
| qmake: | QT += multimedia |
| Hereda: | QObject |
Funciones públicas
| 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 |
Señales
| void | stateChanged(QtAudio::State state) |
Descripción detallada
Se puede construir una entrada de audio con el dispositivo de entrada de audio por defecto del sistema. También es posible crear QAudioSource con un QAudioDevice específico. Cuando crees la entrada de audio, también debes enviar el QAudioFormat que se utilizará para la grabación (consulta la descripción de la clase QAudioFormat para más detalles).
QAudioSink puede utilizarse en dos modos diferentes:
- Utilizando un QIODevice desde un hilo de la aplicación
- Utilizando una interfaz basada en callback desde el hilo de audio
Interfaz QIODevice
QAudioSource te permite grabar audio con un dispositivo de entrada de audio. El constructor por defecto de esta clase utilizará el dispositivo de audio por defecto del sistema, pero también puedes especificar un QAudioDevice para un dispositivo específico. También necesitas pasar el QAudioFormat en el que deseas grabar.
Iniciar el QAudioSource es simplemente cuestión de llamar a start() con un QIODevice abierto para escritura. Por ejemplo, para grabar en un archivo, puedes:
QFile destinationFile; // Miembro de la claseQAudioSource* audio; // Miembro de clase{ destinationFile.setFileName("/tmp/test.raw"); destinationFile.open( QIODevice::WriteOnly | QIODevice::Truncate ); QAudioFormat format; // Configura el formato deseado, por ejemplo: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); // Graba audio durante 3000ms}
Esto iniciará la grabación si el formato especificado es soportado por el dispositivo de entrada (puedes comprobarlo con QAudioDevice::isFormatSupported(). En caso de que haya algún problema, utiliza la función error() para comprobar qué ha ido mal. Detenemos la grabación en la ranura stopRecording().
void AudioInputExample::stopRecording() { audio->stop(); destinationFile.close(); delete audio; }
En cualquier momento, QAudioSource estará en uno de estos cuatro estados: activo, suspendido, detenido o inactivo. Estos estados están especificados por el enum QtAudio::State.
QAudioSource proporciona varias formas de medir el tiempo transcurrido desde la start() de la grabación. La función processedUSecs() devuelve la duración del flujo en microsegundos escritos, es decir, deja fuera los tiempos en que la entrada de audio estuvo suspendida o inactiva. La función elapsedUSecs() devuelve el tiempo transcurrido desde que se llamó a start() independientemente de los estados en los que haya estado la QAudioSource.
Modelo de subprocesos y almacenamiento en búfer
La interfaz QIODevice está diseñada para ser utilizada desde el hilo de la aplicación. Se utiliza un ringbuffer libre de esperas para comunicarse con el hilo de audio. El tamaño de este ringbuffer se puede configurar con setBufferSize() y por defecto es de 250ms. El estado de este buffer puede ser consultado con bytesFree(). Si el ringbuffer está lleno porque la aplicación no lee de QIODevice a tiempo, el estado cambiará a QtAudio::IdleState y se reanudará a QtAudio::ActiveState una vez que la aplicación haya leído los datos de QIODevice. Tenga en cuenta que este cambio de estado dejará caer los datos de audio, por lo que siempre debe leer de QIODevice lo más rápido posible para evitar pérdidas.
Interfaz de devolución de llamada
La forma preferida de conseguir latencias de audio bajas es utilizar la interfaz basada en callback. Te permite leer datos de audio directamente desde el dispositivo de audio sin tener que pasar por QIODevice. Esto se hace llamando a start() con una función callback que será llamada desde el hilo de audio. Esta función callback será llamada con un QSpan<const SampleType> cada vez que el backend de audio produzca datos.
QAudioSource* audio; // miembro de la clase .std::atomic<float> peakLevel; // miembro de la clase.{ QAudioFormat format; // Configura el formato, ej.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) { // Calcula el nivel de pico a partir de las muestras de audiolevel = std::max(level, std::abs(sample)); } peakLevel.store(level); // Nota: hay que tener cuidado si el hilo de la aplicación necesita ser notificado, ya que la // llamada de retorno de audio no debería usar ninguna llamada al sistema potencialmente bloqueante. // Buenas opciones son autoreset events (windows), eventfd (linux) o kqueue/EVFILT_USER en macOS.}); if (!audio->error() == QtAudio::Error::NoError) { // además de las otras firmas de start(), iniciar la llamada de retorno de audio fallará si // * el backend no implementa IO basado en llamadas de retorno (la API está disponible en todas las // principales plataformas) // * la firma de la llamada de retorno de audio no coincide con format.sampleFormat() qWarning() << "Error starting audio output:" << audio->errorString(); } }
A diferencia de la interfaz basada en QIODevice, el QAudioSource solo puede estar en los estados active, suspend y stopped. La API setBufferSize() no está disponible cuando se utiliza el callback, el tamaño del argumento del callback es determinado por el backend de audio.
Nota: Esta API sólo está disponible en plataformas que admitan la API de devolución de llamada: CoreAudio de Apple (macOS, iOS, etc), Windows, Linux (utilizando el backend PulseAudio o PipeWire) y Android.
Nota: La llamada de retorno se realizará en un hilo de audio en tiempo real. Es importante asegurarse de que la llamada de retorno no se bloquea, ya que esto puede causar fallos de audio o caídas. Esto incluye realizar IO bloqueantes, bloquear mutexes, asignar memorias o cualquier otra operación que pueda bloquear. Para las mejores prácticas consulta el artículo de Ross Bencina Real-time audio programming 101: time waits for nothing. También considera el uso de clang's Realtime sanitizer para validar el callback de audio.
Estado y manejo de errores
Los cambios de estado se comunican a través de la señal stateChanged(). Puedes solicitar un cambio de estado directamente a través de suspend(), resume(), stop(), reset(), y start().
La QAudioSource entrará en StoppedState cuando se encuentre un error. El error type se puede recuperar error() función. Por favor vea el enum QtAudio::Error para una descripción de los posibles errores que son reportados. Llamar a stop() o reset() reiniciará el estado de error a 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; } }
Véase también QAudioSink y QAudioDevice.
Documentación de las funciones miembro
[explicit] QAudioSource::QAudioSource(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
Construye una nueva entrada de audio y adjúntala a parent. El dispositivo de entrada de audio por defecto se utiliza con los parámetros de salida format. Si format se inicializa por defecto, el formato se ajustará al formato preferido del dispositivo de audio.
[explicit] QAudioSource::QAudioSource(const QAudioDevice &audioDevice, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr)
Construye una nueva entrada de audio y adjúntala a parent. El dispositivo referenciado por audioDevice se utiliza con los parámetros de entrada format. Si format se inicializa por defecto, el formato se ajustará al formato preferido de audioDevice.
[override virtual noexcept] QAudioSource::~QAudioSource()
Destruye esta entrada de audio.
qsizetype QAudioSource::bufferFrameCount() const
Devuelve el tamaño del búfer de audio en fotogramas.
Si se llama antes de start(), devuelve el valor predeterminado de la plataforma. Si se llama antes de start() pero antes se ha llamado a setBufferSize() o setBufferFrameCount() , devuelve el valor establecido por setBufferSize() o setBufferFrameCount(). Si se llama después de start(), devuelve el tamaño real del búfer que se está utilizando. Este puede no ser el que se estableció previamente en setBufferSize() o setBufferFrameCount().
Véase también setBufferFrameCount() y bufferSize.
[since 6.10] qsizetype QAudioSource::bufferSize() const
Devuelve el tamaño del búfer de audio en bytes.
Si se llama antes de start(), devuelve el valor predeterminado de la plataforma. Si se llama antes de start() pero antes se ha llamado a setBufferSize() o setBufferFrameCount() , devuelve el valor establecido por setBufferSize() o setBufferFrameCount(). Si se llama después de start(), devuelve el tamaño real del búfer que se está utilizando. Este puede no ser el que fue establecido previamente por setBufferSize() o setBufferFrameCount().
Esta función se introdujo en Qt 6.10.
Véase también setBufferSize() y bufferFrameCount.
qsizetype QAudioSource::bytesAvailable() const
Devuelve la cantidad de datos de audio disponibles para leer en bytes.
Nota: el valor devuelto sólo es válido mientras se está en estado QtAudio::ActiveState o QtAudio::IdleState, de lo contrario devuelve cero.
Véase también framesAvailable.
qint64 QAudioSource::elapsedUSecs() const
Devuelve los microsegundos transcurridos desde que se llamó a start(), incluido el tiempo en los estados inactivo y suspendido.
QtAudio::Error QAudioSource::error() const
Devuelve el estado de error.
QAudioFormat QAudioSource::format() const
Devuelve la dirección QAudioFormat que se está utilizando.
[since 6.10] qsizetype QAudioSource::framesAvailable() const
Devuelve la cantidad de datos de audio disponibles para leer en fotogramas.
Nota: el valor devuelto sólo es válido mientras está en estado QtAudio::ActiveState o QtAudio::IdleState, de lo contrario devuelve cero.
Esta función se introdujo en Qt 6.10.
Véase también bytesAvailable.
bool QAudioSource::isNull() const
Devuelve true si la fuente de audio es null, en caso contrario devuelve false.
qint64 QAudioSource::processedUSecs() const
Devuelve la cantidad de datos de audio procesados desde que se llamó a start() en microsegundos.
void QAudioSource::reset()
Elimina todos los datos de audio de los búferes y los pone a cero.
void QAudioSource::resume()
Reanuda el procesamiento de datos de audio tras una llamada a suspend().
Establece state() al estado que tenía el sumidero cuando se llamó a suspend(). Esta función no hace nada si el estado del sumidero de audio no es QtAudio::SuspendedState().
void QAudioSource::setBufferFrameCount(qsizetype value)
Establece el tamaño del búfer de audio en value en número de fotogramas.
Nota: Esta función puede ser llamada en cualquier momento antes de start(). Las llamadas a esta función se ignoran después de start(). No se debe asumir que el tamaño de búfer establecido es el tamaño de búfer real utilizado - llame a bufferFrameCount() en cualquier momento después de start() para devolver el tamaño de búfer real que se está utilizando.
Véase también bufferFrameCount() y setBufferSize.
[since 6.10] void QAudioSource::setBufferSize(qsizetype value)
Establece el tamaño del búfer de audio en value bytes.
Nota: Esta función puede ser llamada en cualquier momento antes de start(), las llamadas a esta función son ignoradas después de start(). No se debe asumir que el tamaño del buffer establecido es el tamaño real del buffer utilizado, llamar a bufferSize() en cualquier momento después de start() devolverá el tamaño real del buffer utilizado.
Esta función se introdujo en Qt 6.10.
Véase también bufferSize() y setBufferFrameCount.
void QAudioSource::setVolume(qreal volume)
Establece el volumen de entrada en volume.
El volumen se escala linealmente de 0.0 (silencio) a 1.0 (volumen máximo). Los valores que queden fuera de este rango se bloquearán.
Si el dispositivo no permite ajustar el volumen de entrada, se ignorará volume y el volumen de entrada permanecerá en 1.0.
El volumen por defecto es 1.0.
Nota: Los ajustes en el volumen cambiarán el volumen de este flujo de audio, no el volumen global.
Véase también volume().
QIODevice *QAudioSource::start()
Devuelve un puntero al QIODevice interno que se está utilizando para transferir datos desde la entrada de audio del sistema. El dispositivo ya estará abierto y read() puede leer datos directamente de él.
Nota: El puntero dejará de ser válido después de detener el flujo o si inicia otro flujo.
Si QAudioSource puede acceder al dispositivo de audio del sistema, state() devuelve QtAudio::IdleState, error() devuelve QtAudio::NoError y se emite la señal stateChanged().
Si se produce un problema durante este proceso, error() devuelve QtAudio::OpenError, state() devuelve QtAudio::StoppedState y se emite la señal stateChanged().
Véase también QIODevice y QIODevice interface.
[since 6.11] template <typename Callback, QtAudio::if_audio_source_callback<Callback> = true> void QAudioSource::start(Callback &&cb)
Inicia el QAudioSource con una función callback que será llamada en un hilo de audio soft-realtime. El callback es un callable que toma un QSpan<const SampleType> como argumento, SampleType tiene que coincidir con el QAudioFormat::SampleFormat del QAudioSource's formato. El span contiene los datos de audio intercalados.
Si el QAudioSource es capaz de arrancar con éxito, error() devuelve QtAudio::NoError.
Si se produce un problema durante este proceso, error() devuelve QtAudio::OpenError, state() devuelve QtAudio::StoppedState y se emite la señal stateChanged().
Nota: Esta API sólo está disponible en plataformas compatibles con la API de devolución de llamada: CoreAudio de Apple (macOS, iOS, etc), Windows, Linux (utilizando el backend PulseAudio o PipeWire) y Android.
Nota: La llamada de retorno se realizará en un hilo de audio en tiempo real. Es importante asegurarse de que la llamada de retorno no se bloquea, ya que esto puede causar fallos de audio o caídas. Esto incluye realizar IO bloqueantes, bloquear mutexes, asignar memorias o cualquier otra operación que pueda bloquear. Para las mejores prácticas consulta el artículo de Ross Bencina Real-time audio programming 101: time waits for nothing. Considera también el uso de clang's Realtime sanitizer para validar el callback de audio.
Esta función se introdujo en Qt 6.11.
Véase también Callback interface.
void QAudioSource::start(QIODevice *device)
Inicia la transferencia de datos de audio desde la entrada de audio del sistema al device. El device debe haber sido abierto en los modos WriteOnly, Append o ReadWrite.
Si QAudioSource consigue obtener los datos de audio, state() devuelve QtAudio::ActiveState o QtAudio::IdleState, error() devuelve QtAudio::NoError y se emite la señal stateChanged() .
Si se produce un problema durante este proceso, error() devuelve QtAudio::OpenError, state() devuelve QtAudio::StoppedState y se emite la señal stateChanged().
Véase también QIODevice y QIODevice interface.
QtAudio::State QAudioSource::state() const
Devuelve el estado del procesamiento de audio.
[signal] void QAudioSource::stateChanged(QtAudio::State state)
Esta señal se emite cuando el dispositivo state ha cambiado.
Nota: El espacio de nombres QtAudio se denominaba QAudio hasta Qt 6.6 inclusive. Las conexiones basadas en cadenas a esta señal tienen que utilizar QAudio::State como tipo de parámetro: connect(source, SIGNAL(stateChanged(QAudio::State)), ...);
void QAudioSource::stop()
Detiene la entrada de audio, separándose del recurso del sistema.
Establece error() en QtAudio::NoError, state() en QtAudio::StoppedState y emite la señal stateChanged().
void QAudioSource::suspend()
Detiene el procesamiento de los datos de audio, conservando los datos de audio almacenados en la memoria intermedia.
Establece error() en QtAudio::NoError, state() en QtAudio::SuspendedState y emite la señal stateChanged().
qreal QAudioSource::volume() const
Devuelve el volumen de entrada.
Si el dispositivo no permite ajustar el volumen de entrada, el valor devuelto será 1.0.
Véase también 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.