Auf dieser Seite

Audiobeispiele im Vergleich zum Schallpegel

Dieses Beispiel zeigt die grafische Darstellung von Mikrofon-Samples im Vergleich zum Audiopegel.

Screenshot eines Diagramms, das den Schallpegel an einem Audioeingang eines Mikrofons anzeigt

Die Umsetzung dieses Beispiels basiert auf Widgets. Spezifische Informationen hierzu finden Sie unter „Erste Schritte bei der Programmierung mit Qt Widgets “. In den folgenden Abschnitten wird erläutert, wie Sie mithilfe der „ Qt Charts “-API dynamische Daten in einem Diagramm zur Darstellung von Abtastwerten im Verhältnis zum Schallpegel anzeigen können. Weitere Informationen zur Abtastung finden Sie unter „Abtastung (Signalverarbeitung)“.

Ausführen des Beispiels

Sie können das Beispiel wie folgt ausführen:

Abrufen der Audiodaten

Dank der Integration des Moduls „ Qt Multimedia “ in „ main.cpp “ erstellen wir ein neues „ QAudioDevice “, das das Standard-Audiogerät der Zielplattform darstellt. Außerdem prüfen wir, ob ein Audio-Eingabegerät vorhanden ist, und informieren den Benutzer, falls kein Audio-Eingabegerät verfügbar ist.

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

Das Audiogerät wird anschließend über das Konstruktorargument „ w “ an das Widget „ w “ übergeben. Anschließend wird „ w.show() “ aufgerufen, um das Widget anzuzeigen.

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

Einrichten des Diagramms

In diesem Abschnitt wird die Einrichtung des Diagramms und der Achsen behandelt.

In ` widget.cpp` übernimmt der neu implementierte Widget-Konstruktor den Großteil der Arbeit, was die Anwendungslogik betrifft. Die Objekte `QChart`, `QLineSeries` und `QChartView` werden wie folgt deklariert:

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

m_series dient zur Verwendung der Audio-Eingabedaten.

Die x-Achse „Samples“

Wir legen den Bereich von minimal bis maximal auf der x-Achse von 0 bis zum Wert von XYSeriesIODevice::sampleCount fest. (In xyseriesiodevice.h als 2000 deklariert.) Anschließend legen wir den Titeltext fest.

    auto axisX = new QValueAxis;
    axisX->setRange(0, XYSeriesIODevice::sampleCount);
    axisX->setLabelFormat("%g");
    axisX->setTitleText("Samples");
Die y-Achse „Audio Level“

Wir erstellen die QValueAxis- axisY, legen ihren Bereich und den Titeltext fest.

    auto axisY = new QValueAxis;
    axisY->setRange(-1, 1);
    axisY->setTitleText("Audio level");
Einfügen der Achsen und Festlegen des Diagrammtitels

Wir fügen die Achsen hinzu, blenden die Legende aus und legen den Diagrammtitel so fest, dass er den Namen des als Audioeingang verwendeten Mikrofons enthält.

    m_chart->addAxis(axisX, Qt::AlignBottom);
    m_series->attachAxis(axisX);
    m_chart->addAxis(axisY, Qt::AlignLeft);
    m_series->attachAxis(axisY);
    m_chart->legend()->hide();
Das Diagramm anordnen

Hier verwenden wir eine „ QVBoxLayout “ mainLayout und fügen unsere „QChartview“ chartView zum vertikalen Layout hinzu.

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

    auto mainLayout = new QVBoxLayout(this);

Verwendung der Audio-Eingangsdaten

In diesem Abschnitt wird gezeigt, wie die Mikrofondaten an die `QLineSeries` m_series übergeben werden. Wie zuvor stützt sich dies auf das Modul Qt Multimedia.

Zunächst übergeben wir „deviceInfo“ an den Konstruktor von „ QAudioInput “.

    mainLayout->addWidget(chartView);

    m_audioInput = new QAudioInput(deviceInfo, this);

    QAudioFormat formatAudio;

Anschließend konfigurieren wir unsere „ QAudioFormat “ mit „ formatAudio “, der Kanalanzahl, der Abtastrate und dem Sample-Format.

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

Nun können wir ein ` QAudioSource ` erstellen und dessen Puffergröße festlegen.

    formatAudio.setSampleFormat(QAudioFormat::UInt8);

    m_audioSource = new QAudioSource(deviceInfo, formatAudio);

Nun ist es an der Zeit, unsere Daten an das Diagramm anzuhängen. Dazu haben wir eine Klasse „XYSeriesIODevice“ erstellt. Wie diese implementiert ist, erfahren Sie unter „XYSeriesIODevice “.

    m_audioSource->setBufferSize(200);

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

XYSeriesIODevice ist in „ xyseriesiodevice.cpp “ implementiert und übernimmt die Signalabtastung. Die Funktion „ writeData “ mit einer festen Auflösung von 4 legt die Größe von „ QList “ m_buffer basierend auf der Abtastanzahl fest und füllt sie mit „QPointFs“, deren x-Wert inkrementell und deren y-Wert auf 0 gesetzt ist.

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

Anschließend führen wir einige Abtastungen durch.

    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;

Beispielprojekt @ 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.