我怀疑以下代码片段...
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 次 |
| 最近记录: |