上预览图
工程文件代码
#------------------------------------------------- # # Project created by QtCreator 2017-02-06T13:52:31 # #------------------------------------------------- QT += core gui QT += charts multimedia greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = qchart_Audio_Project TEMPLATE = app DEFINES += QT_DEPRECATED_WARNINGS SOURCES += main.cpp\ widget.cpp \ xyseriesiodevice.cpp HEADERS += widget.h \ xyseriesiodevice.h FORMS += widget.ui target.path = $$[QT_INSTALL_EXAMPLES]/charts/audio INSTALLS += target
widget.h文件代码
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QtCharts/QChartGlobal> namespace Ui { class Widget; } QT_CHARTS_BEGIN_NAMESPACE class QLineSeries; class QChart; QT_CHARTS_END_NAMESPACE QT_CHARTS_USE_NAMESPACE class XYSeriesIODevice; class QAudioInput; class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; XYSeriesIODevice *m_device; QChart *m_chart; QLineSeries *m_series; QAudioInput *m_audioInput; }; #endif // WIDGET_H
widget.cpp代码
#include "widget.h" #include <QtMultimedia/QAudioDeviceInfo> #include <QtMultimedia/QAudioInput> #include <QtMultimedia/QAudioFormat> #include <QtCharts/QChartView> #include <QtCharts/QLineSeries> #include <QtCharts/QChart> #include <QtWidgets/QVBoxLayout> #include <QtCharts/QValueAxis> #include "xyseriesiodevice.h" #include "ui_widget.h" QT_CHARTS_USE_NAMESPACE Widget::Widget(QWidget *parent) : QWidget(parent),m_device(0), m_chart(0), m_series(0), m_audioInput(0), ui(new Ui::Widget) { ui->setupUi(this); m_chart = new QChart; QChartView *chartView = new QChartView(m_chart); chartView->setMinimumSize(800, 600); m_series = new QLineSeries; m_chart->addSeries(m_series); QValueAxis *axisX = new QValueAxis; axisX->setRange(0, 2000); axisX->setLabelFormat("%g"); axisX->setTitleText("Samples"); QValueAxis *axisY = new QValueAxis; axisY->setRange(-1, 1); axisY->setTitleText("Audio level"); m_chart->setAxisX(axisX, m_series); m_chart->setAxisY(axisY, m_series); m_chart->legend()->hide(); m_chart->setTitle("Data from the microphone"); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(chartView); setLayout(mainLayout); QAudioFormat formatAudio; formatAudio.setSampleRate(8000); formatAudio.setChannelCount(1); formatAudio.setSampleSize(8); formatAudio.setCodec("audio/pcm"); formatAudio.setByteOrder(QAudioFormat::LittleEndian); formatAudio.setSampleType(QAudioFormat::UnSignedInt); QAudioDeviceInfo inputDevices = QAudioDeviceInfo::defaultInputDevice(); m_audioInput = new QAudioInput(inputDevices,formatAudio, this); m_device = new XYSeriesIODevice(m_series, this); m_device->open(QIODevice::WriteOnly); m_audioInput->start(m_device); } Widget::~Widget() { m_audioInput->stop(); m_device->close(); delete ui; }
xyseriesiodevice.h代码
#ifndef XYSERIESIODEVICE_H #define XYSERIESIODEVICE_H #include <QtCore/QIODevice> #include <QtCharts/QChartGlobal> QT_CHARTS_BEGIN_NAMESPACE class QXYSeries; QT_CHARTS_END_NAMESPACE QT_CHARTS_USE_NAMESPACE class XYSeriesIODevice : public QIODevice { Q_OBJECT public: explicit XYSeriesIODevice(QXYSeries * series, QObject *parent = 0); protected: qint64 readData(char * data, qint64 maxSize); qint64 writeData(const char * data, qint64 maxSize); private: QXYSeries *m_series; }; #endif // XYSERIESIODEVICE_H
xyseriesiodevice.cpp代码
#include "xyseriesiodevice.h" #include <QtCharts/QXYSeries> XYSeriesIODevice::XYSeriesIODevice(QXYSeries * series, QObject *parent) : QIODevice(parent), m_series(series) { } qint64 XYSeriesIODevice::readData(char * data, qint64 maxSize) { Q_UNUSED(data) Q_UNUSED(maxSize) return -1; } qint64 XYSeriesIODevice::writeData(const char * data, qint64 maxSize) { qint64 range = 2000; QVector<QPointF> oldPoints = m_series->pointsVector(); QVector<QPointF> points; int resolution = 4; if (oldPoints.count() < range) { points = m_series->pointsVector(); } else { for (int i = maxSize/resolution; i < oldPoints.count(); i++) points.append(QPointF(i - maxSize/resolution, oldPoints.at(i).y())); } qint64 size = points.count(); for (int k = 0; k < maxSize/resolution; k++) points.append(QPointF(k + size, ((quint8)data[resolution * k] - 128)/128.0)); m_series->replace(points); return maxSize; }