如何解决Android回声消除
| 我正在尝试使用AudioRecord开发Audio Capture应用程序 android api中的类,设置,音频源如何 MediaRecorder.AudioSource.MIC,应用有效,但是当我尝试使用时 回声消除,设置一个 MediaRecorder.AudioSource.VOICE_COMMUNICATION当AudioRecorder对象为 创建后,抛出IllegalArgumentException,但是我不知道为什么: 我的代码是:private static final int SAMPLE_RATE = 16000;
private static final int BIT_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private static final int CHANNEL_CONfigURATION = AudioFormat.CHANNEL_CONfigURATION_MONO;
private int m_i32BufferSize;
private AudioRecord m_AudioRecorder;
public caudioCapture ()
{
super ();
m_i32BufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,CHANNEL_CONfigURATION,BIT_ENCODING);
//Create audio recorder object
try
{
m_AudioRecorder = new AudioRecord (MediaRecorder.AudioSource.VOICE_COMMUNICATION,SAMPLE_RATE,BIT_ENCODING,m_i32BufferSize);
}
catch (IllegalArgumentException e)
{
throw new IllegalArgumentException(\"Bad arguments on AudioRecorder creation\",e);
}
在我的Android清单中,我有:
使用权限android:name = \“ android.permission.RECORD_AUdio \”
也许是因为我正在使用Samsung galaxy Tab P1000,并且它与android 2.2一起运行?任何想法?
非常感谢
解决方法
对,那是正确的。问题是您使用的是Android 2.2。 Android 3.0中引入了新的VOICE_COMMUNICATION。在旧版本上运行时,您将获得DEFAULT源。
,我终于能够获得回声消除,以在我的Arm5(WM8650)处理器上工作。以下是我采取的步骤。
我将Speex与JNI封装在一起,并在将PCM帧发送到编码器之前调用了回声处理例程。无论我尝试了什么Speex设置,都没有取消任何回声。
因为Speex对回放和回声帧之间的延迟非常敏感,所以我实现了一个队列,并将所有发送到AudioTrack的数据包排队。队列的大小应大致等于内部AudioTrack缓冲区的大小。这种方法大约是在AudioTrack从内部缓冲区将数据包发送到声卡时,将数据包发送到echo_playback。这种方法消除了延迟,但是回声仍然没有消除
在将数据包发送到编码器之前,我用JNI封装了WebRtc回声消除部分,并调用了其方法。回声仍然存在,但是图书馆显然正在试图取消它。
我应用了P2中描述的缓冲技术,终于开始起作用。但是,需要为每个设备调整延迟。还请注意,WebRtc具有回声消除的移动版和完整版。完整版会大大减慢处理器的速度,因此可能只能在ARM7上运行。移动版本可以使用,但质量较低
我希望这会对某人有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。