我正在尝试使用 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
当我打印我的 QList 时,使用 qWarning() << btlist.at(int),我得到一些代表我的音频幅度的正数和负数。我使用 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 中提取音频幅度?
谢谢你。