2

QT の QAudioInput クラスの bufferSize() と bytesReady() の関係を理解し​​ようとしています。私が持っていると仮定します:

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

と の値を見るbsと(これらはデフォルト値であり、バッファ サイズは変更していません)、 の5 倍の大きbrさであることがわかります。つまり、5 ブロックのオーディオ入力データを保持するバッファーがあるように見えます。私の質問:bsbr

これは循環バッファですか? 私がこれらを持っている場合:

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 が発行された後に read を 2 回実行するreadyRead()と、バッファー ポインターは 1 ブロックから 2 番目のブロックに移動します (合計で 5 ブロックの場合)。
  2. バッファポインタに関するドキュメントはありますか?それが循環バッファであるかどうかなど?
  3. バッファへの自動読み取りおよび書き込みポインタはありますか? それらを処理する必要がありますか、それとも自動的に処理されていますか?

これに関連するヘルプとポインタは非常に高く評価されています。

4

1 に答える 1

0

私はあなたのユースケースを本当に理解していません。まず、あなたが電話したときだと思います

br = m_audioInput->bytesReady();

あなたは または のどちらかにいQAudio::ActiveStateますQAudio::IdleState。そうでなければbrただのジャンクです。

つまり、5 ブロックのオーディオ入力データを保持するバッファーがあるように見えます。

サンプルはオーディオデータの単位です。それが 5 つのサンプルを意味する場合、それは正しくありません。blockエンコードされていないデータに関しては、オーディオのようなものもありません。

バッファ内のオーディオの秒数 (またはミリ秒) を計算できます。

  • バッファサイズ/サンプルサイズは #samples を与える
  • 1/サンプリング周波数により、サンプルサイズが秒単位で得られます
  • サンプル サイズ x #samples は、バッファのサイズを秒単位で表したものです。
  • これはモノモード (1 チャンネル) です。チャンネル数で割る必要があります

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 に答える