Panorama de audio

Características de audio
Qt Multimedia ofrece una serie de clases de audio que abarcan enfoques de bajo y alto nivel para: entrada, salida y procesamiento de audio.
Detalles de la implementación de audio
Reproducción de audio comprimido
Para reproducir archivos multimedia o de audio que no sean audio simple sin comprimir, puede utilizar la clase C++ QMediaPlayer o el tipo QML MediaPlayer. La clase QMediaPlayer y los tipos QML asociados también son capaces de reproducir vídeo, si es necesario.
Para más información, consulte Formatos multimedia compatibles.
El reproductor multimedia debe estar conectado a un objeto QAudioOutput (o al elemento QML AudioOutput ) para reproducir audio.
A continuación se explica cómo reproducir un archivo local utilizando C++:
player = new QMediaPlayer; audioOutput = new QAudioOutput; player->setAudioOutput(audioOutput); // ... player->setSource(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3")); audioOutput->setVolume(0.5); player->play();
La misma funcionalidad en QML:
MediaPlayer { audioOutput: AudioOutput {} source: "file:///path/to/my/music.mp3" Component.onCompleted: { play() } }
Grabación de audio en un archivo
Para grabar audio en un archivo, es necesario crear una sesión de captura y conectar a ella una entrada de audio y una grabadora. Estos elementos se implementan con las clases QMediaCaptureSession, QAudioInput, y QMediaRecorder. La clase construida por defecto QAudioInput selecciona la entrada de audio por defecto del sistema. La grabadora controla el proceso de grabación con unas sencillas funciones record() y stop(). Además, puede utilizarse para seleccionar la ubicación de salida, el codificador de audio o el formato contenedor del archivo.
Una sesión de grabación de audio desde el micrófono por defecto tendría el siguiente aspecto en C++:
QMediaCaptureSession session; QAudioInput audioInput; session.setAudioInput(&input); QMediaRecorder recorder; session.setRecorder(&recorder); recorder.setQuality(QMediaRecorder::HighQuality); recorder.setOutputLocation(QUrl::fromLocalFile("test.mp3")); recorder.record();
En QML se puede conseguir lo mismo:
CaptureSession { audioInput: AudioInput {} mediaRecorder: MediaRecorder { id: recorder outputLocation: "file:///path/to/test.mp3" } Component.onCompleted: { recorder.record() } }
QMediaCaptureSession también proporciona soporte para casos de uso más complejos, como la captura de imágenes o la grabación de vídeo.
Efectos de sonido de baja latencia
Además del acceso directo a los dispositivos de sonido, la clase QSoundEffect (y el tipo QML SoundEffect ) ofrece una forma más abstracta de reproducir sonidos. Esta clase permite especificar un archivo en formato WAV, que puede reproducirse con baja latencia cuando sea necesario.
Puede ajustar la:
- Number of loops en que se reproduce un efecto de sonido.
- Volume del efecto de sonido.
- Muting del efecto de sonido.
Entrada y salida de audio de bajo nivel
La API C++ de Qt Multimedia ofrece clases para el acceso en bruto a las facilidades de entrada y salida de audio, permitiendo a las aplicaciones recibir datos en bruto desde dispositivos como micrófonos, y escribir datos en bruto en altavoces u otros dispositivos. Por lo general, estas clases no realizan ningún tipo de decodificación de audio u otro tipo de procesamiento, pero pueden admitir diferentes tipos de datos de audio sin procesar.
La clase QAudioSink ofrece salida de datos de audio sin procesar, mientras que QAudioSource ofrece entrada de datos de audio sin procesar. El hardware disponible determina qué salidas y entradas de audio están disponibles.
Push and Pull con QIODevice
Las clases de audio de bajo nivel pueden operar en dos modos - push y pull. En el modo pull, el dispositivo de audio se inicia dándole un QIODevice. Para un dispositivo de salida, la clase QAudioSink extraerá datos de QIODevice (usando QIODevice::read()) cuando se requieran más datos de audio. Por el contrario, para el modo pull con QAudioSource, cuando haya datos de audio disponibles, los datos se escribirán directamente en QIODevice.
En el modo push, el dispositivo de audio proporciona una instancia QIODevice en la que se puede escribir o leer según sea necesario.
Nota: QIODevice no accede inmediatamente al dispositivo de audio, sino que almacena los datos internamente. Esto significa que QIODevice puede utilizarse para escribir o leer datos en cualquier momento desde el subproceso de la aplicación y que se añade un búfer de 250 ms. Si la aplicación no envía los datos de audio a QIODevice con la suficiente rapidez (para QAudioSink) o no lee QIODevice con la suficiente rapidez, se producirán cortes de audio.
Interfaz basada en llamadas de retorno
Además de utilizar una interfaz basada en QIODevice, las clases de audio de bajo nivel proporcionan una interfaz basada en callback que permite a los usuarios registrar un callback que es llamado en el hilo de audio cada vez que el dispositivo de audio necesita o entrega más datos. Esto permite un procesamiento de audio de latencia mucho más baja, ya que la aplicación puede procesar los datos directamente en el hilo de audio.
{ 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 play audio.";
return; } audio = new QAudioSink(format, this); float phaseIncrement = 2 * M_PI * 220.0 / format.sampleRate(); // onda sinusoidal de 220 Hz audio->start([&phase, phaseIncrement] (QSpan<float> interleavedAudioBuffer) { // La llamada de retorno de audio no debe llamar a ninguna función que pueda estar potencialmente bloqueando // Llenar el buffer de audio con una onda sinusoidal const int sampleCount = interleavedAudioBuffer.size() / 2; // Estéreo, así que divide por 2 for(int i = 0; i < sampleCount; ++i) { float sample = std::sin(phase); interleavedAudioBuffer[i * 2] = sample; // Canal izquierdointerleavedAudioBuffer[i * 2 + 1] = sample; // Canal derechophase += phaseIncrement; // Incrementa la fase para la siguiente muestra} }); if (!audio->error() == QtAudio::Error::NoError) { // además de las otras firmas de start(), el inicio de 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();
} }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. También considera el uso de clang's Realtime sanitizer para validar el callback de audio.
Decodificación de audio comprimido en memoria
En algunos casos es posible que desees decodificar un archivo de audio comprimido y realizar el procesamiento posterior tú mismo. Por ejemplo, mezclando múltiples muestras o usando algoritmos personalizados de procesamiento de señal digital. QAudioDecoder soporta decodificación de archivos locales o flujos de datos desde instancias QIODevice.
Este es un ejemplo de decodificación de un archivo local:
QAudioFormat desiredFormat; desiredFormat.setChannelCount(2); desiredFormat.setSampleFormat(QAudioFormat::Int16); desiredFormat.setSampleRate(48000); QAudioDecoder *decoder = new QAudioDecoder(this); decoder->setAudioFormat(desiredFormat); decoder->setSource("level1.mp3"); connect(decoder, &QAudioDecoder::bufferReady, this, &AudioDecodingExample::readBuffer); decoder->start(); // Now wait for bufferReady() signal and call decoder->read()
Audio espacial
El módulo Qt Spatial Audio proporciona una API para la implementación de campos de sonido en el espacio 3D.
Documentación de referencia
Clases C
Un sonido superpuesto estéreo | |
Representa una colección de muestras de audio con un formato y frecuencia de muestreo específicos | |
Utilizado para proporcionar buffers de audio personalizados a QMediaRecorder a través de QMediaCaptureSession | |
Utilizado para capturar datos de audio proporcionados por QMediaPlayer | |
Implementa la decodificación de audio | |
Información sobre dispositivos de audio y su funcionalidad | |
Gestiona un campo de sonido tridimensional | |
Almacena información sobre los parámetros del flujo de audio | |
Representa un canal de entrada de audio | |
Define la posición y orientación de la persona que escucha un campo sonoro definido por QAudioEngine | |
Representa un canal de salida de audio | |
Interfaz para enviar datos de audio a un dispositivo de salida de audio | |
Interfaz para recibir datos de audio de un dispositivo de entrada de audio | |
Permite capturar contenidos de audio y vídeo | |
Se utiliza para codificar y grabar una sesión de captura | |
Forma de reproducir efectos de sonido de baja latencia | |
Un objeto de sonido en el espacio 3D | |
Contiene enums utilizados por las clases de audio |
Tipos QML
Un sonido estéreo superpuesto | |
Gestiona objetos de sonido dentro de una escena 3D | |
Una entrada de audio que se utilizará para capturar audio en una sesión de captura | |
Define la posición y orientación de la persona que escucha un campo sonoro definido por un AudioEngine | |
Una salida de audio que se utilizará para reproducir o supervisar una sesión de captura | |
Permite capturar contenidos de audio y vídeo | |
Añade reproducción multimedia a una escena | |
Para codificar y grabar medios generados en una CaptureSession | |
Opciones de reproducción multimedia de bajo nivel | |
El tipo proporciona una forma de reproducir efectos de sonido en QML | |
Un objeto de sonido en el espacio 3D | |
Describe un dispositivo de audio | |
Proporciona metadatos para archivos multimedia |
Ejemplos
Listar los dispositivos de audio disponibles y su configuración. | |
Habilitar la reproducción de audio utilizando la clase QAudioSink. | |
Descubrir los dispositivos disponibles y los codecs soportados. | |
Grabar audio utilizando la clase QAudioSource. | |
Muestra algunas de las capacidades del motor de audio espacial en Qt. |
© 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.