En esta página

Muestras de audio frente a nivel de sonido

Este ejemplo muestra el dibujo de muestras de micrófono vs nivel de audio.

Captura de pantalla de un gráfico que muestra el nivel sonoro procedente de una entrada de audio de un micrófono

La implementación de este ejemplo se basa en Widgets. Consulte Introducción a la programación con Qt Widgets para obtener información específica al respecto. En las siguientes secciones se explica cómo utilizar la API Qt Charts para mostrar datos dinámicos en un gráfico de muestras frente a nivel de sonido. Para obtener más información sobre el muestreo, consulte Sampling_(signal_processing).

Ejecución del ejemplo

Para ejecutar el ejemplo desde Qt Creatorabra el modo Welcome y seleccione el ejemplo de Examples. Para más información, consulte Qt Creator: Tutorial: Construir y ejecutar.

Recuperación de los datos de audio

Gracias a la inclusión del módulo Qt Multimedia en main.cpp, creamos un nuevo QAudioDevice que representa el dispositivo de audio por defecto de la plataforma de destino. También comprobamos que tenemos un dispositivo de entrada de audio y avisamos al usuario si no hay ningún dispositivo de entrada de audio disponible.

    if (inputDevice.isNull()) {
        QMessageBox::warning(nullptr, "audio",
                             "There is no audio input device available.");
        return -1;
    }

El dispositivo de audio se pasa al widget w utilizando el argumento de su constructor w. A continuación, se llama a w.show() para mostrar el widget.

    Widget w(inputDevice);
    w.resize(800, 600);
    w.show();

Configuración del gráfico

Esta sección cubre la configuración del gráfico y los ejes.

En widget.cpp, el constructor reimplementado Widget hace el trabajo pesado cuando se trata de la lógica de la aplicación. Los objetos QChart, QLineSeries, y QChartView se declaran como sigue:

    : QWidget(parent)
    , m_chart(new QChart)
    , m_series(new QLineSeries)
{
    auto chartView = new QChartView(m_chart);
    m_chart->addSeries(m_series);

m_series es para Usar los datos de entrada de audio.

El eje x "Muestras"

Establecemos el rango de mínimo a máximo en el eje x desde 0 hasta el XYSeriesIODevice::sampleCount. (Declarado en xyseriesiodevice.h como 2000). A continuación, establecemos su texto de título.

    auto axisX = new QValueAxis;
    axisX->setRange(0, XYSeriesIODevice::sampleCount);
    axisX->setLabelFormat("%g");
    axisX->setTitleText("Samples");
El eje y "Nivel de Audio

Creamos el QValueAxis axisY , establecemos su rango y el texto del título.

    auto axisY = new QValueAxis;
    axisY->setRange(-1, 1);
    axisY->setTitleText("Audio level");
Fijar los ejes y el título del gráfico

Fijamos los ejes, ocultamos la leyenda y establecemos el título del gráfico para que incluya el nombre del micrófono utilizado como entrada de audio.

    m_chart->addAxis(axisX, Qt::AlignBottom);
    m_series->attachAxis(axisX);
    m_chart->addAxis(axisY, Qt::AlignLeft);
    m_series->attachAxis(axisY);
    m_chart->legend()->hide();
Diseño del gráfico

Aquí usamos QVBoxLayout mainLayout y añadimos nuestro QChartview chartView al diseño vertical.

    m_chart->setTitle("Data from the microphone (" + deviceInfo.description() + ')');

    auto mainLayout = new QVBoxLayout(this);

Uso de los datos de entrada de audio

Esta sección muestra cómo se pasan los datos del micrófono a QLineSeries m_series . Como antes, esto depende del módulo Qt Multimedia.

Primero pasamos deviceInfo a un constructor QAudioInput.

    mainLayout->addWidget(chartView);

    m_audioInput = new QAudioInput(deviceInfo, this);

    QAudioFormat formatAudio;

Después configuramos nuestro QAudioFormat formatAudio , su número de canales, frecuencia de muestreo y formato de muestreo.

    formatAudio.setSampleRate(8000);
    formatAudio.setChannelCount(1);

Ahora podemos crear un QAudioSource y establecer su tamaño de búfer.

    formatAudio.setSampleFormat(QAudioFormat::UInt8);

    m_audioSource = new QAudioSource(deviceInfo, formatAudio);

Ahora es el momento de adjuntar nuestros datos al gráfico. Para ello hemos creado una clase XYSeriesIODevice. Ver XYSeriesIODevice para saber cómo se implementa.

    m_audioSource->setBufferSize(200);

    m_device = new XYSeriesIODevice(m_series, this);
    m_device->open(QIODevice::WriteOnly);
XYSeriesIODevice

Implementado en xyseriesiodevice.cpp, XYSeriesIODevice se encarga del muestreo de la señal. La función writeData, con una resolución fija de 4, establece el tamaño de QList m_buffer basado en el conteo de muestreo, y lo llena con QPointFs con un valor x incremental y el valor y establecido a 0.

{
    static const int resolution = 4;

    if (m_buffer.isEmpty()) {
        m_buffer.reserve(sampleCount);
        for (int i = 0; i < sampleCount; ++i)
            m_buffer.append(QPointF(i, 0));
    }

    int start = 0;

A continuación hacemos un muestreo.

    const int availableSamples = int(maxSize) / resolution;
    if (availableSamples < sampleCount) {
        start = sampleCount - availableSamples;
        for (int s = 0; s < start; ++s)
            m_buffer[s].setY(m_buffer.at(s + availableSamples).y());
    }

    for (int s = start; s < sampleCount; ++s, data += resolution)
        m_buffer[s].setY(qreal(uchar(*data) -128) / qreal(128));

    m_series->replace(m_buffer);
    return (sampleCount - start) * resolution;

Proyecto de ejemplo @ code.qt.io

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