2

現在、Xamarin.iOS プラットフォームに基づくクロス プラットフォームの Voip アプリ開発に取り組んでいます。iOS での AEC 実装について検索しましたが、ほとんどのトピックは Objective-C に関連しています。私がすでに達成したことは、Audiotoolbox (オーディオ キュー) を使用して、マイクから入力生のサウンド データを取得し、それをソケットで送信できることです。しかし、他のデバイスでのテスト中に、電話で非常に明確なエコーが発生しています。コードは次のとおりです。

private void SetupInputQueue()
    {
        inputQueue = new InputAudioQueue(audioStreamBasicDescription);
        //sendbuffer initialization
        heading = Encoding.ASCII.GetBytes("msg ");
        sendBuffer = new byte[CountAudioBuffers][];
        for (int i = 0; i < CountAudioBuffers; i++)
        {
            sendBuffer[i] = new byte[516];
            for (int j = 0; j < heading.Length; j++)
            {
                sendBuffer[i][j] = heading[j];
            }
        }

        for (int count = 0; count < CountAudioBuffers; count++)
        {
            IntPtr bufferpointer;
            inputQueue.AllocateBuffer(AudioBufferLength, out bufferpointer);
            inputQueue.EnqueueBuffer(bufferpointer, AudioBufferLength, null);
        }
        inputQueue.InputCompleted += HandleInputCompleted;
    }

    private void HandleInputCompleted(object sender, InputCompletedEventArgs e)
    {
        unsafe
        {
            byte* shortPtr = (byte*)e.UnsafeBuffer->AudioData;
            for (int count = heading.Length; count < sendBuffer[sendOutIndex].Length; count++)
            {
                sendBuffer[sendOutIndex][count] = *shortPtr;
                shortPtr++;
            }
        }
        socket.SendTo(sendBuffer[sendOutIndex], master);
        this.inputQueue.EnqueueBuffer(e.IntPtrBuffer, AudioBufferLength, null);
        sendOutIndex = (sendOutIndex + 1) % CountAudioBuffers;
    }

AudioQueue を使用した OSX 上の AEC によると、生のサウンド データを I/O ユニット (オーディオ ユニット?) に渡す必要があるというヒントを学びました。しかし、Xamarin.iOS(c#) の例が不足しているため、このプロセスを詳細に実装する方法を理解できません。Xamarin プラットフォームでの Voip アプリの開発に精通している方は、参考になる例を教えていただけますか? これに関するヘルプやヒントをいただければ幸いです。

(2018 年 11 月 21 日) 私が見つけたいくつかの関連記事:オーディオ ユニットでオーディオを録音する オーディオ ユニットのコールバック オーディオ ユニットの例

4

2 に答える 2