问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

有人用过android 4.1的新API里的AcousticEchoCanceler 回声消除吗

发布网友 发布时间:2022-05-12 22:14

我来回答

1个回答

热心网友 时间:2023-10-25 21:46

  下面简单的备忘下AcousticEchoCanceler的使用方法:

  1)判断当前机型是否支持AEC,需要注意这里的检查不一定准确。

  public static boolean isDeviceSupport()
  {
  return AcousticEchoCanceler.isAvailable();
  }
  2)初始化并使能AEC。

  private AcousticEchoCanceler canceler;

  public boolean initAEC(int audioSession)
  {
  if (canceler != null)
  {
  return false;
  }
  canceler = AcousticEchoCanceler.create(audioSession);
  canceler.setEnabled(true);
  return canceler.getEnabled();
  }
  3)使能/去使能AEC。

  public boolean setAECEnabled(boolean enable)
  {
  if (null == canceler)
  {
  return false;
  }
  canceler.setEnabled(enable);
  return canceler.getEnabled();
  }
  4)释放AEC。

  public boolean release()
  {
  if (null == canceler)
  {
  return false;
  }
  canceler.setEnabled(false);
  canceler.release();
  return true;
  }
  AcousticEchoCanceler的初始化需要一个sessionid,下面简单的备忘下上层的调用方式:

  1)初始化AudioRecord的时候需要处理第一个参数。

  if (chkNewDev())
  {
  audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, frequency, channelIN, audioEncoding, tmpSize);
  }else
  {
  audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelIN, audioEncoding, tmpSize);
  }
  2)初始化好audioRecord之后,就可以通过

  audioRecord.getAudioSessionId()
  获取到相应的sessionid。

  3)初始化AudioTrack时,也需要额外的处理sessionid。

  if (chkNewDev() && audioRecord != null)
  {
  audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, frequency, channelOUT, audioEncoding, tmpSize, AudioTrack.MODE_STREAM,audioRecord.getAudioSessionId());
  }
  else
  {
  audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, frequency, channelOUT, audioEncoding, tmpSize, AudioTrack.MODE_STREAM);
  }
  另外,由于API的*,需要考虑机型不匹配的情况:

  public static boolean chkNewDev()
  {
  return android.os.Build.VERSION.SDK_INT >= 16;
  }
  权限:

  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  总结:

  1)android新版本增加的API AcousticEchoCanceler 可以非常快速的开发出符合VOIP性质的回声消除程序。但是考虑到各种机型适配,仍然需要第三方的回声消除程序。这里主要推荐两个:webrtc里面的AEC/AECM,speex。

  作者成功的在项目中使用了webrtc里面的回声消除,感觉效果还可以。

  2)作者编写的上述代码也只是根据官方的介绍编写的,由于资料较少,不能保证代码的正确性。
转载
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
遇到碰瓷怎么办 导致碰瓷者伤亡用负法律责 最新电子防盗装置 3个LED的小夜灯电路 买不到小功率3伏变压器,如何降压做个3伏70毫安电源 小夜灯按钮坏了怎么拆 哪里有各种定做手提袋 如图,我这个配置玩逆战为何会卡?pvp200左右,pve75左右,ping二三十,网... 女孩问你是的时候怎么回答 自习课 同学都睡着了 男同桌问我让我跟他比赛 比谁撒尿尿得远 问他... 想把一个女同学上了,又不想负责任,毕竟她对我没意思,我对她也没意思... 有一个晚上,女同学叫我一起玩,玩着玩着到了半夜,回自己的宿舍太远就... 念生堂阿胶片和福牌阿胶片那个好? 山东东阿咏年堂阿胶生物工程有限公司怎么样? 念生堂阿胶5百元一盒是真是假? 请阿胶同是念生堂牌子的生产日期相同但条码后四位数不相同是其中一个是假冒吗? 濮阳市念生堂阿胶生物有限公司怎么样? 东阿县念生堂阿胶制品有限公司怎么样? 念胶堂是什么企业有多少员工 念生堂牌的阿胶片能吃吗 怎么看发的朋友圈有没有被和谐 怎么看自己朋友圈发给哪些标签 为什么我的电脑无法自动获取dns服务器地址 自己设的也连不上 为什么我的电脑不能自动获得DNS服务器地址? 电脑无法自动获取dns地址 学习形式 我的是函授专科该怎么填? 图片上传为什么展示不出来,用的myeclipse做的,是jsp拼错了吗? 18650电池家里放着很多,不用的,扔了有点浪费,不知想做什用上,大家给指点一下,可以拿来做什么用 用不着的手机锂电池或18650电池有什么其他用处吗 难忘的启蒙老师,这篇作文怎么写? 开男装店赚钱吗求解 启蒙老师作文600字 网络诈骗视频会发给通讯录吗 全国在学研究生313.96万人,你觉得研究生考试难度如何? 致命的遗传病有哪些? 我男朋友说他不能吃牛肉和鸡肉,他说他吃了会死,为什么,他说一种家族遗传病,请问是什么病啊 毕业前后考研究生难度有区别吗 家族遗传的高血压会死吗 又来麻烦你了,android回音消除,有没有什么相关算法或者是相关资料推荐一下啊?谢谢 必死无疑的遗传病,但是没发病的时候跟正常人一样! 视频诈骗三分钟发通讯录会真发的吗? 一个家族里几代都有男人频繁病死 一般要挟人不打钱就发视频到通讯录的骗子真的会发吗? 20左右发病致死的家族遗传病都有哪些? 曹操家族是有什么遗传病?怎么都死的那么早? 有一种家族遗传病总是流鼻血,从小到大都会,最近越来越频繁了。查不出来什么病,最大到三十岁就会死的 我家族遗传癌症!我估计我四十岁就得死,我该怎么办? 人会死是因为染色体的原因吗! 关于家族遗传病 家族遗传病地中海贫血会不会死能不能好 遗传病会死人的 有关于家族的遗传病