Qt4中學習使用QtCharts繪圖二:聲波繪製

一、實例編寫環境

操做系統:Windows 10 企業版
開發工具:Visual Studio 2010 旗艦版
開發環境:Qt4.8.6,QtCharts
編程語言:C++編程

二、實例涉及的內容

本實例主要是經過獲取電腦的自帶音頻輸入設備獲取聲音信息,而後經過使用QtCharts對聲波進行繪製。涉及主要類有:QAudioDeviceInfo、QAudioInput、QAudioFormat、QIODevice。在使用Qt庫進行開發時候,你們使用頻率較高的多數爲Qt的界面控件類,你們也就都比較熟悉了。
QAudioDeviceInfo:該類提供了查詢音頻設備及其功能的接口。
QAudioInput:該類提供用於從音頻輸入設備接收音頻數據的接口。
QAudioFormat:該類除了包含音頻流的編碼信息以外,還包含了其它參數信息。這些額外的參數進一步指明瞭:頻率、通道數量、樣本大小、樣本類型和字節順序等信息。
QIODevice:該類是Qt中全部IO設備的基類接口(在筆者的實際工做中不多本身主動重寫QIODevice類來實現某些功能,一般Qt中已經實現QFile、QTextStream、QDataStream等功能已經足夠完善)。app

三、實例效果

Qt4中學習使用QtCharts繪圖二:聲波繪製
Qt4中學習使用QtCharts繪圖二:聲波繪製

四、關鍵代碼片斷

void QtChartAudio::Initialize()
{
    //建立並設置繪圖要素//
    m_chart        = ui.graphicsView->chart();
    m_chart->setTheme(QChart::ChartThemeDark);

    m_series       = new QLineSeries;
    m_chart->addSeries(m_series);

    m_axisX        = new QValueAxis;
    m_axisX->setRange(0,DataSource::sampleCount);
    m_axisX->setLabelFormat("%g");
    m_axisX->setTitleText(QString::fromLocal8Bit("採樣率"));
    m_axisX->setLabelsColor(QColor(255,255,0));
    m_axisY        = new QValueAxis;
    m_axisY->setRange(-1,1);
    m_axisY->setTitleText(QString::fromLocal8Bit("音頻水平"));
    m_axisY->setLabelsColor(QColor(255,255,0));

    m_chart->addAxis(m_axisX,Qt::AlignBottom);
    m_series->attachAxis(m_axisX);
    m_chart->addAxis(m_axisY,Qt::AlignLeft);
    m_series->attachAxis(m_axisY);

    m_chart->legend()->hide();
    m_chart->setTitleBrush(QBrush(QColor(0,255,255)));
    m_chart->setTitleFont(QFont(QString::fromLocal8Bit("宋體"),15));
    m_chart->setTitle(QString::fromLocal8Bit("從麥克風採集數據繪製音頻數據"));
    m_chart->setFont(QFont(QString::fromLocal8Bit("宋體"),19));

    //設置音頻格式//
    QAudioFormat formatAudio;
    formatAudio.setSampleRate(8000);
    formatAudio.setChannelCount(1);
    formatAudio.setSampleSize(8);
    formatAudio.setCodec("audio/pcm");
    formatAudio.setByteOrder(QAudioFormat::LittleEndian);
    formatAudio.setSampleType(QAudioFormat::UnSignedInt);
    m_audioInput = new QAudioInput(QAudioDeviceInfo::defaultInputDevice(),formatAudio,this);

    //開始傳輸數據//
    m_dataSource   = new DataSource(m_series,this);
    m_dataSource->open(QIODevice::WriteOnly);
    m_audioInput->start(m_dataSource);
}
qint64 DataSource::writeData(const char *data, qint64 len)
{
    //更新麥克風採集的音頻數據//
    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;
    const int availableSamples = int(len) / 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;
}

五、實例源碼獲取編程語言

完整的實例代碼,請在在筆者的下載中心搜索下載(查找本博客同名標題資源進行下載)。若有任何發現任何問題或者疑問,能夠留言或者聯繫做者進行反饋哦!ide

相關文章
相關標籤/搜索