• Qt Charts_Audio实践


    这里完全是照搬帮助文档中的代码生成的程序

    上预览图

    工程文件代码

    #-------------------------------------------------
    #
    # 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;
    }
    


  • 相关阅读:
    ansible的管理与剧本
    条件随机场入门(二) 条件随机场的模型表示
    条件随机场入门(一) 概率无向图模型
    隐马尔科夫模型
    高斯混合模型 GMM
    K-Means 算法
    EM 算法
    Sequential Minimal Optimization (SMO) 算法
    LinkedIn文本分析平台:主题挖掘的四大技术步骤
    SVM 核方法
  • 原文地址:https://www.cnblogs.com/DreamDog/p/9160043.html
Copyright © 2020-2023  润新知