我对以下代码段有疑问...

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可用的一切,直到可用的缓冲区空间。

09-11 17:33