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

时间:2012-08-26 15:40:10

标签: c++ qt audio buffer

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

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

当我查看bsbr的值(这些是默认值而我没有更改缓冲区大小)时,我发现bsbr大5倍{ {1}}。所以看起来有一个缓冲区可以容纳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个块移动到第2个块(如果它总共有5个块)?
  2. 是否有关于缓冲区指针的文档,如果它是循环缓冲区等?
  3. 是否有自动读写缓冲区的指针?我需要照顾那些,还是自动照顾它?
  4. 非常感谢任何与此相关的帮助和指针。

1 个答案:

答案 0 :(得分:0)

我真的不了解你的用例。首先,我想你打电话时

br = m_audioInput->bytesReady();

您位于QAudio::ActiveStateQAudio::IdleState。否则br只是垃圾。

  

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

Sample是音频数据的单位。如果你的意思是5个样本,那么它是不正确的。当涉及到非编码数据时,也没有block音频这样的东西。

您可以计算缓冲区中音频的秒数(或毫秒):

  • 缓冲区大小/样本大小为#samples
  • 1 /采样频率为您提供样本大小(
  • 样本大小x #samples缓冲区的大小,以秒为单位。
  • 那是单声道模式(一个频道)。您需要除以通道数

在Qt:

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