2

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

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

当我查看bsand的值br(这些是默认值并且我没有更改缓冲区大小)时,我看到它bsbr. 所以看起来有一个缓冲区可以保存 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. 它是否以循环方式从缓冲区读取?即,如果我在发出 a 之后执行读取 2 次readyRead(),缓冲区指针是否从 1 个块移动到第二个块(如果它总共有 5 个块)?
  2. 是否有关于缓冲区指针的文档,如果它是循环缓冲区等?
  3. 是否有指向缓冲区的自动读写指针?我需要照顾那些,还是自动得到照顾?

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

4

1 回答 1

0

我真的不明白你的用例。首先,我想当你打电话时

br = m_audioInput->bytesReady();

你要么在QAudio::ActiveState要么QAudio::IdleState。否则br只是垃圾。

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

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

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

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

在 Qt 中:

   BuffersizeSeconds = (int)((1.0/m_format->sampleRate())
                             *(m_audioInput->bufferSize()/m_format->sampleSize())
                             *(1.0/m_format->channelCount())
                             );  
于 2012-08-27T08:45:11.117 回答