微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用AcousticEchoCanceler时,是否需要为AudioTrack和AudioRecord分配相同的AudioSessionId?

如何解决使用AcousticEchoCanceler时,是否需要为AudioTrack和AudioRecord分配相同的AudioSessionId?

我在AcousticEchoCanceler功能在我的Google Pixel 3a和设置中无法正常工作(实际上是减去回声)时遇到了麻烦。我的设置包括一部电话(在本例中为我的Pixel)和台式计算机,它们通过网络相互交换音频数据包。最终目标是双向音频应用程序。双向音频发生并且起作用,但是正如我之前提到的,存在回声。

我已经搜索过SO,但是在需要启用/禁用的内容以及即使它们确实起作用的情况下,我发现了相互矛盾的结果。

通过搜索,我发现我需要启用InCommunication:

 AudioManager am = (AudioManager)this.GetSystemService(Context.AudioService);
            am.Mode = Mode.InCommunication;

但是尚不清楚是否需要通过会话ID将AudioTrack和AudioRecord绑在一起,尽管在我看来,似乎无关紧要,因为我仍然得到回声:

                int bufferSize = AudioRecord.GetMinBufferSize(SampleRate,ChannelIn.Mono,Android.Media.Encoding.Pcm16bit);


                AudioRecord record = new AudioRecord(
                    AudioSource.VoiceCommunication,//44100,SampleRate,Android.Media.Encoding.Pcm16bit,bufferSize);

                if (EchoCancellationAvailable)
                {
                    AcousticEchoCanceler aec = AcousticEchoCanceler.Create(record.AudioSessionId);
                    if (!aec.Enabled)
                    {
                        aec.SetEnabled(true);
                    }
                }

                int numBytesToWrite = AudioTrack.GetMinBufferSize(SampleRate,ChannelOut.Mono,Android.Media.Encoding.Pcm16bit);

                AudioTrack play = new AudioTrack(
                    Android.Media.Stream.Music,numBytesToWrite,AudioTrackMode.Stream,record.AudioSessionId);

然后我在两个单独的线程中使用AudioRecord和AudioTrack。我是否将两个对象正确关联在一起?我需要吗?关于回声消除为什么没有真正减去回声,是否还有其他问题值得关注?

谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。