我怀疑以下代码段...
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。
答案 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(可能为零)
...然后使用sz
和qba.data();
...似乎没有错误,不像QAudioInput
,这是非常破坏,例如,Windows下的任意采样率限制为48000而不是OSX,拉模式使用前台线程因此会不断分解在任何实际情况下,bytesReady()
都没有意义......最糟糕的是。 Qt的。常规。 EVAR!