转载请标明出处:(二)Android音频录制研究_stormxiaofeng的博客-优快云博客
上一篇实现了Android端文字的传输 点击打开链接,由于此系列要实现Android端语音的传输,所以这篇就先研究一下Android端语音的录制。先上效果图吧:
这是主页就是几个按钮:音频的录制分为文件录制和字节流录制,
(1)文件采用Media Record录制和Media Player播放
(2)字节流采用Audio Record录制和Audio Track播放
(3)音量可视化就是实时获取音量大小,显示到屏幕上面
(4)简单实现声音的变速,加速播放和减速播放
上代码:
(1)文件录制
需要说明的是录音JNI函数不具备线程安全性,所以采用了单线程的线程池
executorService = Executors.newSingleThreadExecutor();
因为录音线程在子线程,录音失败和成功与主线程交互,采用了Handler
mainThreadHandler = new Handler(Looper.getMainLooper());
tvSpeak.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //按下按钮开始录制 startRecord(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: //松开按钮结束录制 stopRecord(); break; } return true; } });
private void startRecord() { tvSpeak.setText("正在说话"); //提交后台任务,执行录音逻辑 executorService.submit(new Runnable() { @Override public void run() { //释放之前录音的recorder releaseRecorder(); //执行录音逻辑,如果失败 提示用户 if (!doStart()) { recordFail(); } } }); }
private void stopRecord() { tvSpeak.setText("按住说话"); //提交后台任务,执行停止逻辑 executorService.submit(new Runnable() { @Override public void run() { //执行停止录音逻辑,失败就要提醒用户 if (!doStop()) { recordFail(); } //释放recorder releaseRecorder(); } }); }
private boolean doStart() { try { //创建mediaRecorder mediaRecorder = new MediaRecorder(); //创建录音文件 mAudioFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyUdpDemo/" + System.currentTimeMillis() + ".m4a"); mAudioFile.getParentFile().mkdirs(); mAudioFile.createNewFile(); //配置Media Recorder mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setAudioSamplingRate(44100); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mediaRecorder.setAudioEncodingBitRate(96000); //设置录音文件的位置 mediaRecorder.setOutputFile(mAudioFile.getAbsolutePath()); //开始录音 mediaRecorder.prepare(); mediaRecorder.start(); //记录开始录音时间 用于统计时长 mStartRecordTime = System.currentTimeMillis(); } catch (IOException e) { e.printStackTrace(); return false; } return true; }
private boolean doStop() { //停止录音 try { mediaRecorder.stop(); //记录停止时间 mStopRecordTime=System.currentTimeMillis();