我目前正在开发基于 Xamarin.iOS 平台的跨平台 Voip 应用程序。我确实搜索了 iOS 上的 AEC 实现,但大多数主题都与 Objective-C 相关。我现在已经实现的是:我可以使用 Audiotoolbox(音频队列)从 mic 获取输入的原始声音数据并通过套接字将其发送出去。但是在使用其他设备进行测试时,我在手机上遇到了非常清晰的回声。这是代码:
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 on OSX using AudioQueue,我了解到我应该将原始声音数据传递给 I/O 单元(音频单元?)。但是由于 Xamarin.iOS(c#) 中缺少示例,我无法弄清楚如何详细实现这个过程。任何熟悉 Xamarin 平台上 Voip 应用程序开发的人可以给我一些学习的例子吗?非常感谢任何帮助或提示。
(2018 年 11 月 21 日)我发现的一些相关帖子:使用音频单元录制音频 Audio unit Callbacks An audio unit example