Qt (c++) を使用して、QAudioinput と QIODevice を使用してマイクからオーディオを録音できるプログラムを作成しようとしています。私は調査を行い、このページにある例を思いつきました。この例は、私が必要とすることを行います。
今、録音した音のオーディオ波形を作成しようとしています。オーディオの振幅を抽出して QList に保存したいと考えています。そのために、次のコードを使用します。
//Check the number of samples in input buffer
qint64 len = m_audioInput->bytesReady();
//Limit sample size
if(len > 4096)
len = 4096;
//Read sound samples from input device to buffer
qint64 l = m_input->read(m_buffer.data(), len);
if(l > 0)
{
//Assign sound samples to short array
short* resultingData = (short*)m_buffer.data();
for ( i=0; i < len; i++ )
{
btlist.append( resultingData[ i ]);
}
}
m_audioInput は QAudioinput | m_buffer は QBytearray | m_input は QIODevice | btlist は QList です
次の QAudioFormat を使用します。
m_format.setFrequency(44100); //set frequency to 44100
m_format.setSampleRate(44100); //set sample rate to 44100
m_format.setChannels(1); //set channels to mono
m_format.setSampleSize(16); //set sample sze to 16 bit
m_format.setSampleType(QAudioFormat::SignedInt ); //signed integer sample
m_format.setByteOrder(QAudioFormat::LittleEndian); //Byte order
m_format.setCodec("audio/pcm"); //set codec as simple audio/pcm
qWarning() << btlist.at(int) を使用して QList を出力すると、オーディオの振幅を表す正と負の数値が得られます。Microsoft Excel を使用してデータをプロットし、実際の音波形と比較しました。
(OPコメントに基づいて編集)このようにQtでQPainterを使用して波形を描画しています
for(int i = 1; i < btlist.size(); i++){
double x1 = (i-(i/1.25))-0.2;
double y1 = btlist.at(i-1);
double x2 = i-(i/1.25);
double y2 = btlist.at(i);
painter.drawLine(x1,y1,x2, y2);
}
問題は、このような振幅データ間の QList にも多くのゼロ (0) が含まれていることです。これを波形として描画すると、波形が破損するため、正常ではありません。私の質問は、なぜそれが起こっているのですか?これらのゼロ (0) は何を表していますか? 私は何か間違ったことをしていますか?また、QBytearray からオーディオの振幅を抽出するより良い方法はありますか?
ありがとうございました。