问答文章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-04-25 11:51

我来回答

1个回答

热心网友 时间:2024-11-22 16:11

下面简单的备忘下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
甲状腺穿刺细胞病理学检查及分子检测实践分享 认识甲状腺的解剖结构 ...其中左侧中部一个大小约4.7*3.1mm,下部背侧一 甲状腺疾病 严不严重 这是什么病 拍抖音视频如何赚钱 未成年人出国旅游 可不可以不跟监护人一起? 急! 关于未成年人去香港的问题 未成年自己报旅行社去度假村可以吗? 未成年人去香港旅游要多交多少钱? 未成年人参加旅行社旅游需要监护人么? webrtc linux编译能不能在windows用 webrtc aecm和aec的区别 翁文灏先生对国家的贡献 郑州创灏企业管理咨询有限公司怎么样? 灏驰中华童话 广东税务医保缴费怎么办理? 怎样在广东化州税务微信公众号交社保费? 粤省事可以给外省户口缴合作医疗吗? 在广东税务微信公众号上不小心操作了社保停保 灵活就业人员在广东税务微信公众号上缴纳社保,选择了变更险种,为什么在... 广东各市是否预约办税,可在哪里进行预约 黄头侧颈龟怎么分雌雄? 乌龟要怎样辨别公母?为什么有的壳比较方,有的壳比较圆,有的头上有红... 请问乌龟公母要怎么分辩? 如何区分雄龟和雌龟? 苏州久运彩板活动房厂怎么样? 制作蛋黄玉米时,将蛋黄泥放入锅中时,会起很多泡沫,并且玉米炒不干,这... 煮熟的玉米可以用泡沫箱保温一天吗? 熬玉米糊糊的说说 为什么鸡那么喜欢吃泡沫? webrtc能支持windows xp吗 如何在没有https环境下使用webrtc WebRTC有前途吗 如何替换webrtc中的websocket webrtc怎么使用socket实现一对多直播 webRTC 怎么移植到IOS上 手机上的WPS文件删掉了怎么办 电脑wps软件删除了怎么恢复 wps文件删掉了怎么恢复 美容师要会哪些手法? 颈椎退行性变!做莎蔓香妃美容院的肩颈疗理疗按摩能治好吗? 肩颈按摩哪里好? CAD的图形为什么按个空格就没有了呢 cad画线时输入尺寸按空格键就没了,是怎么回事? CAD按H空格后就这样了,没有拾取框也没有十字光标,不能填充,怎么回事... CAD靶框不见了,只显示十字靶 打开CAD时有中间小方块拾取框,可是输入命令时中间的小方框就没有了怎 ... 保险买的越多,是不是赔的就越多 买了多份保险,就能获得多份赔偿吗? cad2015填充 选择按添加拾取点后,为什么不能按空格 回去,就这样...