我怀疑以下代码片段...
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.
它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提供的任何内容,直至可用的缓冲区空间.
归档时间: |
|
查看次数: |
2119 次 |
最近记录: |