QAudioInput :: byteReady()和QIODevice :: read()给出不同的字节数

sho*_*fee 6 qt qt4.8

我怀疑以下代码片段...

const qint64 bytesReady = m_audioInput->bytesReady();
const qint64 bytesSpace = m_buffer.size() - m_dataLength;
const qint64 bytesToRead = qMin(bytesReady, bytesSpace);
const qint64 bytesRead = m_audioInputIODevice->read(m_buffer.data() + m_dataLength, bytesToRead);
Run Code Online (Sandbox Code Playgroud)

bytesReady()方法给了我一个特定的字节数,并将这些字节数传递给QIODevice的read(),它将返回读取的字节数.

问题是bytesRead不等于bytesToRead.并且我从读取方法获得固定的字节数,即320,640,960,1280等,这取决于byteToRead.

Chr*_*wet 7

QAudioInput::bytesReady()QIODevice样本之间没有直接关系.

QAudioInput在内部维护一个IO设备(取决于系统)到音频系统,它类似于只读QIODevice.当你调用时bytesReady,它返回可读取的字节数,模拟为QIODevice::bytesAvailable().那些还没有被写入输出QIODevice,所以当你m_audioInputIODevice->read在它之后执行它而不处理事件时,你实际上得到的是先前写过的样本,而不是那些仍在音频缓冲区中的样本.

这个加上IODevice的缓冲,解释了为什么数字可能不同,我没有看到将它们同步的方法.

实际上,你应该这样做:

const qint64 bytesRead = m_audioInputIODevice->read(m_buffer.data() + m_dataLength, bytesSpace);
Run Code Online (Sandbox Code Playgroud)

获取IODevice提供的任何内容,直至可用的缓冲区空间.