1

Qt のマルチメディア ライブラリは初めてで、アプリケーションで複数の入力デバイス (マイクなど) からのオーディオをミックスして、TCP 経由でストリーミングしたいと考えています。

私が知る限り、QAudioDeviceInfo必要なすべてのデバイスの仕様を最初に取得し、それに応じたQAudioFormatオブジェクトを使用する必要がありますQAudioInputstart()次に、作成されたすべてのオブジェクトを呼び出すだけでQAudioInput、保留中のバイトをreadLine().

しかし、どうすれば複数のデバイスのオーディオ データを 1 つのバッファにミックスできますか?

4

1 に答える 1

3

これを行うQt固有のメソッド/クラスがあるかどうかはわかりません。ただし、自分で行うのは非常に簡単です。

最も基本的な方法 (PCM を使用していると仮定) は、2 つのストリーム/バッファーを単語ごとに追加するだけです (覚えていれば、それらは 16 ビットの PCM 単語でした)。

したがって、2 つの入力バッファーがある場合は、次のようになります。

int16 buff1[10];
int16 buff2[10];
int16 mixBuff[10];

// Fill them...
//... code goes here to read from the buffers ....

// Add them (effectively mix them)

for (int i = 0; i < 10; i++)
{
   mixBuff[i] = buff1[i] + buff2[i];
}

さて、これは非常に大雑把で、スケーリングは考慮されていません。したがって、buff1 と buff2 の両方がダイナミック レンジの 80% を使用することを想像してください (これをフル ボリュームと呼び、それを超えると歪みが発生します)、それらを一緒に追加すると、数値オーバーランが発生します (つまり、16 ビットの最大値は 65535 であるため、50000 + 50000 はオーバーランになる)。

混合するたびに、実質的に 2 つの入力の半分が必要になります (つまり、65535 / 2 + 65535 / 2 = 65535 ... つまり、それらを合計するとオーバーランできなくなります)。したがって、ミックスコードは次のようになります。

for (int i = 0; i < 10; i++)
{
   mixBuff[i] = (buff1[i] >> 1) + (buff2[i] >> 1);
}

できることは他にもたくさんありますが (ノイズの除去など...)、計算がやや​​こしくなり始めます。これは非常に簡単です。後でシフトを使用して、必要に応じて単純な音量コントロールとして音量を増減できます。

編集

注意すべきことの1つ... readline() を使用しています(ドキュメントでは、データをASCIIとして読み取ると書かれています)。私は常に read() を使用しますが、読み出される「フォーマット」は明記されていませんが、バイナリを想定しています。したがって、このコードは readline() を使用すると機能しない可能性がありますが、試したことはありません。read() ではうまく機能します。データを操作したい場合は、ASCII で作業する必要はありません。

于 2016-01-06T12:05:15.343 に答える