ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android平台 音频录制踩坑记

2022-05-20 11:01:16  阅读:206  来源: 互联网

标签:坑记 音频 AudioRecord try audioRecord file new Android recorder


Android平台 音频录制播放主要方式有两个:  AudioRecord 和 MediaRecord.

AudioRecord 是更底层的类, 能够实现边录边播, 通过(AudioRecord 和 AudioTrack组合实现汤姆猫应用等)输出的是pcm语音数据,需要自己实现数据转码才能够播放。

MediaRecord 主要是 用来录像的,是更偏向于应用层的类。集成了录音 编码 压缩,只支持少量的录音音频格式,如3gp amr acc等

 

AudioRecord 是将采集到的 指定声音采样数据的 信息记录在一个相关联的buffer中, 我们可以对裸数据进行操作

// 获得缓冲区字节大小      
// 采样频率
// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道 // 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。 int bufferSizeInBytes = AudioRecord.getMinBufferSize(AudioFileFunc.AUDIO_SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); // 创建AudioRecord对象 第一个参数:音频获取源 AudioRecord audioRecord = new AudioRecord(AudioFileFunc.AUDIO_INPUT, AudioFileFunc.AUDIO_SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes); try { audioRecord.startRecording(); } catch (IllegalStateException e) { e.printStackTrace(); } new Thread(new AudioRecordThread()).start(); // 开启数据写入线程 class AudioRecordThread implements Runnable { @Override public void run() { writeDateToFile();//往文件中写入数据 listener.onSpeechOver(0); } } private static void writeDateTOFile() { // new一个byte数组用来存一些字节数据,大小为缓冲区大小 final byte[] audiodata = new byte[bufferSizeInBytes]; FileOutputStream fos = null; try { File file = new File(currentFilePath); if (file.exists()) { file.delete(); } file.createNewFile(); fos = new FileOutputStream(file);// 建立一个可存取字节的文件 } catch (Exception e) { e.printStackTrace(); } while (mIsRecording == true) { final int size = audioRecord.read(audiodata, 0, bufferSizeInBytes); if (AudioRecord.ERROR_INVALID_OPERATION != size) { try { fos.write(audiodata); calculateVolume(audiodata, 0, size); } catch (IOException e) { e.printStackTrace(); } } } try { fos.close();// 关闭写入流 } catch (IOException e) { e.printStackTrace(); } } private void close() { if (audioRecord != null) { mIsRecording = false;//停止文件写入 try { audioRecord.stop(); audioRecord.release();//释放资源 } catch (Exception e) { e.printStackTrace(); } audioRecord = null; } }

 

MediaRecord:直接指定输出文件 中间过程进行程序介入不太方便。

MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(OUTPUT_FILENAME);
recorder.prepare();
recorder.start();
...
recorder.stop();
recorder.release();
// reset 之后相当于整个record重新构造
recorder.reset();

 

标签:坑记,音频,AudioRecord,try,audioRecord,file,new,Android,recorder
来源: https://www.cnblogs.com/lesten/p/9726390.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有