private AudioRecord audioRecord;
private Button start;
private Button stop;
private volatile int state;
private File outPutFile;
private File wavOutFile;private AutomaticGainControl automaticGainControl = null;
//杂音消除
private NoiseSuppressor noiseSuppressor = null;
//回音消除
private AcousticEchoCanceler acousticEchoCanceler = null;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);quanxian();setContentView(R.layout.activity_main);initView();//语音录制//参数一:采样率 单位 Hz//参数二:声道//参数三:PCM的编码int minBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,//音频源44100,//采样率AudioFormat.CHANNEL_IN_STEREO,//通道配置 立体声通道AudioFormat.ENCODING_PCM_16BIT,//音频格式 16位minBufferSize);outPutFile = new File(Environment.getExternalStorageDirectory(),"audio.pcm");if(!outPutFile.exists()){try {outPutFile.createNewFile();} catch (IOException e) {e.printStackTrace();}}wavOutFile = new File(Environment.getExternalStorageDirectory(),"audio.wav");if(!wavOutFile.exists()){try {wavOutFile.createNewFile();} catch (IOException e) {e.printStackTrace();}}//自动增强控制器if(AutomaticGainControl.isAvailable()){automaticGainControl = AutomaticGainControl.create(audioRecord.getAudioSessionId());automaticGainControl.setEnabled(true);}//消除噪音if(NoiseSuppressor.isAvailable()){noiseSuppressor = NoiseSuppressor.create(audioRecord.getAudioSessionId());noiseSuppressor.setEnabled(true);}//回音消除控制器if(AcousticEchoCanceler.isAvailable()){acousticEchoCanceler = AcousticEchoCanceler.create(audioRecord.getAudioSessionId());acousticEchoCanceler.setEnabled(true);}
}private void initView() {start = findViewById(R.id.btn_start);stop = findViewById(R.id.btn_stop);
}
private Runnable runnable = new Runnable() {OutputStream outputStream = null;@Overridepublic void run() {try {outputStream = new FileOutputStream(outPutFile);if(outputStream == null){Log.e("录音","文件异常");return;}byte[] bytes = new byte[1024];while(state == 1){int read = audioRecord.read(bytes, 0, bytes.length);outputStream.write(bytes,0,read);}outputStream.close();PcmToWav.copyWaveFile(outPutFile.getPath(),wavOutFile.getPath(),44100,1024);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
};@RequiresApi(api = Build.VERSION_CODES.M)
private void quanxian() {if(Build.VERSION.SDK_INT >= 16){requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.RECORD_AUDIO},100);}
}@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if(requestCode == 100){}
}public void click(View view) {switch (view.getId()){case R.id.btn_start:state = 1;audioRecord.startRecording();new Thread(runnable).start();break;case R.id.btn_stop:audioRecord.stop();state = 0;break;}
}@Override
protected void onDestroy() {super.onDestroy();if(automaticGainControl!=null){automaticGainControl = AutomaticGainControl.create(audioRecord.getAudioSessionId());automaticGainControl.setEnabled(true);}//消除噪音if(noiseSuppressor.isAvailable()){noiseSuppressor = NoiseSuppressor.create(audioRecord.getAudioSessionId());noiseSuppressor.setEnabled(true);}//回音消除控制器if(acousticEchoCanceler.isAvailable()){acousticEchoCanceler = AcousticEchoCanceler.create(audioRecord.getAudioSessionId());acousticEchoCanceler.setEnabled(true);}
}
public class PcmToWav {public static void copyWaveFile(String inFileName, String outFileName, int sampleRateInHz, int bufferSizeInBytes) {FileInputStream in = null;FileOutputStream out = null;long totalAudioLen = 0;long totalDataLen = totalAudioLen + 36;long longSampleRate = sampleRateInHz;int channels = 2;long byteRate = 16 * sampleRateInHz * channels / 8;byte[] data = new byte[bufferSizeInBytes];try {in = new FileInputStream(inFileName);out = new FileOutputStream(outFileName);totalAudioLen = in.getChannel().size();totalDataLen = totalAudioLen + 36;writeWaveFileHeader(out, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate);while(in.read(data) != -1){out.write(data);}in.close();out.close();} catch (FileNotFoundException e){e.printStackTrace();} catch (IOException e){e.printStackTrace();}}public static void writeWaveFileHeader(FileOutputStream out, long totalAudioLen,long totalDataLen, long longSampleRate, int channels, long byteRate)throws IOException {byte[] header = new byte[44];header[0] = 'R'; // RIFF/WAVE headerheader[1] = 'I';header[2] = 'F';header[3] = 'F';header[4] = (byte) (totalDataLen & 0xff);header[5] = (byte) ((totalDataLen >> 8) & 0xff);header[6] = (byte) ((totalDataLen >> 16) & 0xff);header[7] = (byte) ((totalDataLen >> 24) & 0xff);header[8] = 'W';header[9] = 'A';header[10] = 'V';header[11] = 'E';header[12] = 'f'; // 'fmt ' chunkheader[13] = 'm';header[14] = 't';header[15] = ' ';header[16] = 16; // 4 bytes: size of 'fmt ' chunkheader[17] = 0;header[18] = 0;header[19] = 0;header[20] = 1; // format = 1header[21] = 0;header[22] = (byte) channels;header[23] = 0;header[24] = (byte) (longSampleRate & 0xff);header[25] = (byte) ((longSampleRate >> 8) & 0xff);header[26] = (byte) ((longSampleRate >> 16) & 0xff);header[27] = (byte) ((longSampleRate >> 24) & 0xff);header[28] = (byte) (byteRate & 0xff);header[29] = (byte) ((byteRate >> 8) & 0xff);header[30] = (byte) ((byteRate >> 16) & 0xff);header[31] = (byte) ((byteRate >> 24) & 0xff);header[32] = (byte) (2 * 16 / 8); // block alignheader[33] = 0;header[34] = 16; // bits per sampleheader[35] = 0;header[36] = 'd';header[37] = 'a';header[38] = 't';header[39] = 'a';header[40] = (byte) (totalAudioLen & 0xff);header[41] = (byte) ((totalAudioLen >> 8) & 0xff);header[42] = (byte) ((totalAudioLen >> 16) & 0xff);header[43] = (byte) ((totalAudioLen >> 24) & 0xff);out.write(header, 0, 44);}}

手机录音+消除杂音+消除回声相关推荐

  1. 聊聊实时音视频中的技术难点:回声消除+噪声消除

    文 | 菊风媒体引擎资深研究团队 在各个实时音视频互动场景中,回声和噪声对于影响用户体验而言都是很大的问题.音视频正在发展成为互联网线上沟通的必然趋势,在自然的交流环境中,回声和噪声是非常影响沟通体验 ...

  2. 聊聊语音聊天室app源码实时音视频中的技术难点:回声消除+噪声消除

    聊聊语音聊天室app源码实时音视频中的技术难点:回声消除+噪声消除 在聊聊语音聊天室app源码各个实时音视频互动场景中,回声和噪声对于影响用户体验而言都是很大的问题.音视频正在发展成为互联网线上沟通的 ...

  3. 模仿手机QQ红点消除功能

    简介 手机QQ红点消除的功能大家应该印象很深,我一直奇怪微信为什么不跟进这个功能,毕竟消息太多. 功能图如下: 简单的功能描述是这样的:新消息到来以后,会出现红点,红点被拉扯,在短距离内出现粘连效果, ...

  4. 录音有杂音怎么提取人声,分享三个方法给大家!

    现如今,许多朋友都喜欢使用手机记录生活中有趣的事物,有时候选择视频记录,有时则会采用录音方式.然而,在录音的过程中,我们常常遇到周围环境嘈杂的问题.录下来的声音充斥着许多杂音,这让我们希望能够去除这些 ...

  5. 手机录音失真_“手机都能录音,还要啥录音笔”,四点原因让说这话的人啪啪打脸...

    相信很多人都有个疑问,现在智能手机都能录音了,为什么还是那么多人买录音笔,而且一些比较高端的录音笔价格还不算便宜,当真"人傻钱多"? 小编可以斩钉截铁的说,真不是这样!录音笔作为专 ...

  6. [源码和文档分享]基于FFMEPEG-MATLAB和C#-SQL SERVER构建的手机录音数据库及特征分析...

    当今科学技术发展迅猛,知识爆炸信息量的急剧增加不仅仅丰富了我们的现实生活,也对我们的信息处理技术提出了新的要求.音频信号在这信息洪流中占据着不可或缺的重要地位,诸如语音聊天,音频取证等在我们的生活中发 ...

  7. 手机录音m4a怎么转换成mp3

    手机录音m4a怎么转换成mp3?手机录音文件的格式种类比较多,有时候不同品牌的手机录音都有自己的音频格式,不过最常见的手机录音格式还是mp3.不过iphone手机的录音格式就比较特殊,是m4a格式,m ...

  8. 八百呼的手机录音系统,一个划时代的进步

    手机让沟通更加方便,录音系统让沟通留有凭据.八百呼的手机APP,不仅替代原本手机的录音系统,还能够实现其他多种多样的功能,满足企业一切可实施性需求,只为了让手机录音系统更加具有实用价值.企业不被淘汰, ...

  9. 华为通话录音怎么备份到云盘_华为手机录音文件在哪?华为查看录音文件及备份教程...

    不少用华为手机的同学说 华为云服务同步备忘录和录音后,竟不知道在哪里恢复 查看,那你就跟着往下看吧. 华为手机录音文件在哪? 进入通话界面,点击录音进行通话录音,结束通话后会弹出录音文件存储位置的提示 ...

最新文章

  1. iOS-Swift中的递增(++)和递减(--)被取消的原因-官方答复
  2. 机房突然发生爆炸事件如何处理?为什么会这样
  3. JavaScript高级程序设计20.pdf
  4. 分布式压测系列之Jmeter4.0第一季
  5. Spring Cloud Config的配置中心获取不到最新配置信息的问题
  6. 一些与HTML相关名词的简介
  7. SVN环境搭建详解(来源网络)
  8. ALTERA 命名规则
  9. Spring之事务控制
  10. ctf 改变图片高度_在Unity中 改变地形(Terrain),并加上水面、树、草地、材质(地板上色)...
  11. 电源大师课笔记 2.8
  12. 系统分析师教程电子版资料收集
  13. C#通过LPT控制打印机——txt文档读取指令打印条码
  14. 安装Hadoop2.10.1
  15. 光波叠加matlab,光波的叠加教程.ppt
  16. STM32L0外接32768HZ晶振应该接多大的负载电容才合适
  17. ios内存管理(整理篇)
  18. python笑脸猫图案_酷叮猫编程课堂:python生成字符画
  19. 【Java】求最大公约数
  20. Unity 之 发布 Mac 报错 il2cppcore.dll did not run propertly

热门文章

  1. C语言一些常用的函数
  2. shell获取目录下所有文件夹的名称并输出
  3. 计算机网络高校校园网设计思路,校园网规划及相关技术全套版.doc
  4. 学校机房电脑控制如何彻底解除
  5. 亚马逊、阿里国际、Shopee、Temu等跨境电商平台测评自养号经验分享
  6. 【飞桨领航团AI达人养成营】课节1: Python计算基础学习笔记
  7. 「职场职业」什么是CTO(首席技术官)?需要知道的关于首席技术官的一切
  8. 《凌云》第六期——直击AWDC2014-阿里云生态系统观察
  9. java人脸识别快速搭建_基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
  10. 《扬帆优配》猪肉概念股拉升走高,新五丰一度涨停