Audio-Samples vs. Schallpegel
Dieses Beispiel zeigt das Zeichnen von Mikrofonsamples im Vergleich zum Audiopegel.
Die Implementierung dieses Beispiels basiert auf Widgets. Siehe Erste Schritte in der Programmierung mit Qt Widgets für spezielle Informationen dazu. In den folgenden Abschnitten wird beschrieben, wie die Qt Charts API verwendet wird, um dynamische Daten in einem Diagramm mit Abtastwerten im Vergleich zum Schallpegel anzuzeigen. Weitere Informationen zum Sampling finden Sie unter Sampling_(signal_processing).
Ausführen des Beispiels
Zum Ausführen des Beispiels von Qt Creatorzu starten, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.
Abrufen der Audiodaten
Dank der Einbindung des Moduls Qt Multimedia in main.cpp
erstellen wir ein neues QAudioDevice, das das Standard-Audiogerät der Zielplattform darstellt. Wir überprüfen auch, ob ein Audio-Eingabegerät vorhanden ist, und teilen dem Benutzer mit, wenn kein 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 dann an das Widget w
mit seinem Konstruktorargument w
übergeben. Dann wird w.show()
aufgerufen, um das Widget anzuzeigen.
Widget w(inputDevice); w.resize(800, 600); w.show();
Einrichten des Diagramms
Dieser Abschnitt behandelt das Einrichten des Diagramms und der Achsen.
In widget.cpp
übernimmt der neu implementierte Widget-Konstruktor die schwere Arbeit, wenn es um die Anwendungslogik geht. 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 ist für die Verwendung der Audio-Eingangsdaten.
Die x-Achse "Samples"
Wir setzen den Min- bis Max-Bereich auf der x-Achse von 0 bis zum XYSeriesIODevice::sampleCount. (Deklariert in xyseriesiodevice.h als 2000). Dann setzen wir den Titeltext.
auto axisX = new QValueAxis; axisX->setRange(0, XYSeriesIODevice::sampleCount); axisX->setLabelFormat("%g"); axisX->setTitleText("Samples");
Die y-Achse "Audiopegel"
axisY
Wir erstellen die QValueAxis, legen ihren Bereich und den Titeltext fest.
auto axisY = new QValueAxis; axisY->setRange(-1, 1); axisY->setTitleText("Audio level");
Anhängen der Achsen und Setzen des Diagrammtitels
Wir fügen die Achsen ein, blenden die Legende aus und setzen den Diagrammtitel so, dass er den Namen des Mikrofons enthält, das als Audioeingang verwendet wird.
m_chart->addAxis(axisX, Qt::AlignBottom); m_series->attachAxis(axisX); m_chart->addAxis(axisY, Qt::AlignLeft); m_series->attachAxis(axisY); m_chart->legend()->hide();
Anlegen des Diagramms
Hier verwenden wir ein QVBoxLayout mainLayout
und fügen ein QChartview chartView
zum vertikalen Layout hinzu.
m_chart->setTitle("Data from the microphone (" + deviceInfo.description() + ')'); auto mainLayout = new QVBoxLayout(this);
Verwendung der Audioeingangsdaten
Dieser Abschnitt zeigt, wie die Mikrofondaten an das QLineSeries m_series
übergeben werden. Wie zuvor basiert dies auf dem Qt Multimedia Modul.
Zuerst übergeben wir deviceInfo an einen QAudioInput Konstruktor.
mainLayout->addWidget(chartView); m_audioInput = new QAudioInput(deviceInfo, this); QAudioFormat formatAudio;
Dann richten wir unser QAudioFormat formatAudio
ein, dessen Kanalzahl, Abtastrate und Abtastformat.
formatAudio.setSampleRate(8000); formatAudio.setChannelCount(1);
Jetzt 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. Zu diesem Zweck haben wir eine Klasse XYSeriesIODevice erstellt. Siehe XYSeriesIODevice, um zu erfahren, wie es implementiert ist.
m_audioSource->setBufferSize(200); m_device = new XYSeriesIODevice(m_series, this); m_device->open(QIODevice::WriteOnly);
XYSeriesIODevice
Implementiert in xyseriesiodevice.cpp
, kümmert sich XYSeriesIODevice um die Signalabtastung. Die Funktion writeData
mit einer festen Auflösung von 4 legt die Größe von QList m_buffer
basierend auf der Anzahl der Abtastungen fest und füllt sie mit QPointFs mit einem inkrementellen x-Wert und einem auf 0 gesetzten y-Wert.
{ 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;
Dann führen wir einige Stichproben 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;
© 2025 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.