gpt4 book ai didi

qt - QAudioInput::byteReady() 和 QIODevice::read() 给出不同的字节数

转载 作者:行者123 更新时间:2023-12-04 11:12:51 26 4
gpt4 key购买 nike

我对以下代码片段有疑问……

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 获取可用的任何内容,直到可用的缓冲区空间。

关于qt - QAudioInput::byteReady() 和 QIODevice::read() 给出不同的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9664309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com