4

iOS で VOIP プロジェクトに取り組んでいます。Apple のドキュメントで提案されているように、VoiceProcessingIO オーディオ ユニットを使用してエコー キャンセルをサポートしています。

私のアプリでは、レンダリング側とキャプチャ側で別々の操作が必要なので (例: スピーカーをシャットダウンし、マイクは継続する)、2 つのオーディオ ユニットを作成します。一方にはキャプチャ ポートをシャットダウンし、もう一方にはレンダリング ポートをシャットダウンします。

現在のコードは、エコー キャンセレーションがどのように機能するかを理解するまでは問題なく機能します。マイクとスピーカーの両方からの信号を比較する必要があります。だから私の懸念は、私のアプローチのように2つの音声処理オーディオユニットを使用しても安全ですか? また、オーディオ キャンセルは主にキャプチャ側から機能するため、RemoteIO オーディオ ユニットを使用してレンダリング (スピーカーに接続) することは可能ですか?

このエリアに入ったのはほんの短い時間なので、100% の自信はありません。developer.apple.com からも試してみましたが、developer.apple.com で見つけたすべての例は通常、1 つのオーディオ ユニットしか使用していません。

誰かヒントを教えてください。私のアプローチは、VoiceProcessingIO ユニットの機能に影響を与える可能性がありますか?

ありがとう、福州

4

1 に答える 1

1

まず、VoiceProcessingIOは(私がこれを書いている時点では)エコー抑制のみであり、エコーキャンセルではありません。出力が大きすぎる場合は、基本的に入力をオフにするだけです。これは、たとえばVOIP通話では、遠端が話している間はあなたの声を聞くことができないことを意味します。完全なエコーキャンセルは入力をオンのままにしますが、出力のエコーを差し引こうとします。

ユニットを1つだけ使用し、「シャットダウンスピーカー」のケースをプログラムで自分で処理することをお勧めします。出力コールバックは次のようになります。

OSStatus output_callback(
    void *inRefCon,
    AudioUnitRenderActionFlags  *ioActionFlags,
    const AudioTimeStamp        *inTimeStamp,
    UInt32                      inInputBusNumber,
    UInt32                      inNumberFrames,
    AudioBufferList             *ioData)
{
  my_context_t *context = inRefCon;
  audio_sample_t *dst = (audio_sample_t *)ioData->mBuffers[0].mData;

  if (context->muted) {
    memset(dst, 0, inNumberFrames * sizeof(audio_sample_t));
  } else {
    get_output_samples(context, dst, inNumberFrames);
  }
  return noErr;
}

エコー抑制に無音を与えることはそれに悪影響を与えるべきではありません。

于 2012-10-10T14:26:39.937 に答える