gpt4 book ai didi

c++ - QT中QAudioInput bufferSize()和bytesReady()的关系

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:59:17 24 4
gpt4 key购买 nike

我试图了解 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 个音频输入数据 block 。我的问题:

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

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 次,缓冲区指针是否从第一个 block 移动到第二个 block (如果它总共有 5 个 block )?
  2. 是否有关于缓冲区指针的文档,是否是循环缓冲区等?
  3. 是否有指向缓冲区的自动读写指针?我需要处理这些,还是自动处理?

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

最佳答案

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

br = m_audioInput->bytesReady();

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

So it looks like there is a buffer that holds 5 blocks of audio input data.

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

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

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

在 Qt 中:

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

关于c++ - QT中QAudioInput bufferSize()和bytesReady()的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12131439/

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