Xamarin.iOS上的声学回声消除(AEC)



我目前正在基于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;
}

根据OSX上使用AudioQueue的AEC,我学会了将原始声音数据传递给I/O单元(音频单元?(的提示。但由于Xamarin.iOS(c#(中缺少示例,我无法详细了解如何实现此过程。熟悉Xamarin平台上Voip应用程序开发的人能给我举个例子吗?非常感谢任何帮助或提示。

(Nov,212018(我发现的一些相关帖子:用音频单元录制音频音频单元回调音频单元示例

我建议分析系统中回声的性质(例如测试回声路径(。也许这超出了内置回声消除的功能范围。

最后我们找到了如何在Xamarin.iOS平台上打开AEC中的iOS构建。这里的文档有助于更好地了解音频单元的细节(尽管本文档适用于iOS原生开发环境(和工作机制。如果您想精确控制每个音频单元并了解功能中的参数,则必须阅读本文档。

这里的工作为在音频单元上进行实验提供了一个很好的起点。我在这篇文章的第二步做了一些修改。关键部分是我们必须使用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();
}

相关内容

  • 没有找到相关文章

最新更新