QT中的QAudioInput bufferSize()和bytesReady()之间的关系

relation between QAudioInput bufferSize() and bytesReady() in QT

本文关键字:之间 关系 bytesReady bufferSize 中的 QT QAudioInput      更新时间:2023-10-16

我正在尝试理解QT中QAudioInput类的bufferSize()和bytesReady()之间的关系。假设我有:

m_audioInput = new QAudioInput(m_Inputdevice, m_format, this);
bs = m_audioInput->bufferSize();
br = m_audioInput->bytesReady();

当我查看bsbr的值(这些是默认值,我没有更改缓冲区大小)时,我发现bsbr大5倍。因此,看起来有一个缓冲区可以容纳5个音频输入数据块。我的问题:

这是一个循环缓冲区吗?如果我有这些:

m_input = m_audioInput->start();
connect(m_input, SIGNAL(readyRead()), SLOT(myFunc()));

然后当我执行读取时:

MainClass::myFunc()
{
   qint64 l = m_input->read(m_buffer.data(), br);
   .
   .
 }
  1. 它是否以循环方式从缓冲区读取?即,如果在readyRead()发出之后我执行读取2次,那么缓冲区指针是否从1个块移动到第二个块(如果它总共有5个块)
  2. 是否有关于缓冲区指针的文档,以及它是否是循环缓冲区等
  3. 是否有指向缓冲区的自动读写指针?我需要照顾这些吗,还是它会自动得到照顾

非常感谢与此相关的任何帮助和指示。

我真的不理解您的用例。首先,我想当你打电话给时

br = m_audioInput->bytesReady();

您处于QAudio::ActiveStateQAudio::IdleState。否则br就是垃圾。

因此,看起来有一个缓冲区可以容纳5个音频输入数据块。

样本是音频数据的一个单位。如果你的意思是5个样本,那么这是不正确的。当涉及到非编码数据时,也不存在音频的block

你可以计算缓冲区中有多少秒(或毫秒)的音频:

  • 缓冲区大小/样本大小给出#个样本
  • 1/采样频率以秒为单位提供样本大小
  • sample size x#以秒为单位对缓冲区的大小进行采样
  • 这是单声道模式(一个声道)。你需要除以频道的数量

在Qt:

   BuffersizeSeconds = (int)((1.0/m_format->sampleRate())
                             *(m_audioInput->bufferSize()/m_format->sampleSize())
                             *(1.0/m_format->channelCount())
                             );