我对以下代码段有疑问...
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。
最佳答案
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可用的一切,直到可用的缓冲区空间。