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

时间:2012-03-12 09:15:44

标签: 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);

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

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

2 个答案:

答案 0 :(得分: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);

获取IODevice中可用的任何内容,直至可用的缓冲区空间。

答案 1 :(得分:2)

更好的是:

使用->readAll()返回QByteArray“qba”

...然后使用sz=qba.size()来告诉你GOT(可能为零)

...然后使用szqba.data();

对其执行某些操作

...似乎没有错误,不像QAudioInput,这是非常破坏,例如,Windows下的任意采样率限制为48000而不是OSX,拉模式使用前台线程因此会不断分解在任何实际情况下,bytesReady()都没有意义......最糟糕的是。 Qt的。常规。 EVAR!