Акустическое эхоподавление (AEC) на Xamarin.iOS - PullRequest
0 голосов
/ 21 ноября 2018

В настоящее время я занимаюсь кроссплатформенной разработкой приложений Voip на основе платформы Xamarin.iOS.Я провел поиск по реализации AEC на iOS, но большинство тем связано с 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;
    }

В соответствии с AEC на OSX с использованием AudioQueue , я понял намек на то, что я должен передать необработанные звуковые данные на блок ввода-вывода (аудиоустройство?).Но из-за отсутствия примеров в Xamarin.iOS (c #) я не могу понять, как реализовать этот процесс в деталях.Может ли кто-нибудь, знакомый с разработкой приложений Voip на платформе Xamarin, дать мне пример для изучения?Очень ценю любую помощь или подсказку по этому вопросу.

(21 ноября 2018 г.) Некоторые похожие посты, которые я нашел: Запись аудио с аудиоустройством Аудиоустройство Обратные вызовы Пример аудиоустройства

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Наконец, мы выяснили, как включить встроенный AEC для iOS на платформе Xamarin.iOS.Документация здесь очень помогла лучше понять детали Audio Unit (даже если этот документ предназначен для среды разработки iOS) и рабочего механизма.Если вы хотите точно контролировать каждое аудиоустройство и понимать параметры в функциях, этот документ необходимо прочитать.

Работа здесь обеспечивает очень хорошую отправную точку для эксперимента с аудиоустройством.,Я сделал некоторые изменения в шаге 2 этого поста.Ключевая часть заключается в том, что мы должны использовать AudioTypeOutput.VoiceProcessingIO, это включает AEC.

public void prepareAudioUnit()
    {

        var _audioComponent =   AudioComponent.FindComponent(AudioTypeOutput.VoiceProcessingIO);

        audioUnit = new AudioUnit.AudioUnit(_audioComponent);

        audioUnit.SetEnableIO(true,
            AudioUnitScopeType.Input,
            1 // Remote Input
        );

        // setting audio format
        audioUnit.SetAudioFormat(audioStreamBasicDesc,
            AudioUnitScopeType.Output,
            1
        );                                    

        audioUnit.SetInputCallback(input_CallBack, AudioUnitScopeType.Input, 1);

        audioUnit.SetRenderCallback(render_CallBack, AudioUnitScopeType.Global, 0);


        audioUnit.Initialize();
        audioUnit.Start();
    }
0 голосов
/ 22 ноября 2018

Я предлагаю проанализировать характер эхо, которое вы имеете в вашей системе (например, проверить путь эха ).Возможно, это за пределами возможностей встроенного эхоподавления.

...