1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 手机录音+消除杂音+消除回声

手机录音+消除杂音+消除回声

时间:2019-07-27 02:34:53

相关推荐

手机录音+消除杂音+消除回声

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)@Overrideprotected 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);}}@Overrideprotected 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;}}@Overrideprotected 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);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。