操做系統: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三、實例效果
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