AudioRecord可以将手机或麦克风的声音录制成pcm格式的语音文件,本案例将再service中实现pcm声音的录制,并提供将pcm格式语音转化为mp3格式的方法,先来看看AudioRecord如何实现声音的录制吧!
以下是小编封装的AudioRecord类,代码如下:
package com.xuanyin.homektv.service; import android.app.Service; import android.content.Intent; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Binder; import android.os.IBinder; import android.support.annotation.Nullable; import android.util.Log; import com.xuanyin.homektv.MainActivity; import com.xuanyin.homektv.util.WaveHeader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; public class RecorderService extends Service { private AudioRecord audioRecord; private int bufferSize; private Thread recordThread = null; private String songName = "test_new"; private boolean isRunning = true; private byte[] voiceData; private String fileUrl = ""; private String outFileUrl = ""; @Nullable @Override public IBinder onBind(Intent intent) { return new Binder(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { //此处可以获取到录音界面传递过来的值,如小编录制的是歌曲声音,所以获取了一个歌曲名称“SONG_NAME”的值 if(intent.hasExtra("SONG_NAME")){ songName = intent.getStringExtra("SONG_NAME"); } startRecorder(); return START_STICKY; } public void startRecorder(){ //比特率16000hz,视自己的设备比特率而定 bufferSize = AudioRecord.getMinBufferSize(16000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT); voiceData = new byte[bufferSize]; audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,16000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize); audioRecord.startRecording(); recordThread = new Thread(new Runnable() { @Override public void run() { writeAudioToDirectory(); } },"recorder Thread"); recordThread.start(); } //将语音写入pcm文件中 private void writeAudioToDirectory() { Long times = System.currentTimeMillis(); String filePath = MainActivity.MY_SONGS_VOICE + songName +"_"+times+ ".pcm"; fileUrl = filePath; outFileUrl = MainActivity.MY_SONGS_VOICE+times+".mp3"; FileOutputStream os = null; try { os = new FileOutputStream(filePath); } catch (FileNotFoundException e) { e.printStackTrace(); } int read = 0; while(isRunning){ read = audioRecord.read(voiceData,0,bufferSize); if(read >= 0){ try{ os.write(voiceData); os.flush(); Log.e("writeAudioToDirectory3","在写入文件:"+read); }catch (Exception ex){ ex.printStackTrace(); } } } } //停止录音 public void stopRecorder(){ isRunning = false; if(recordThread != null){ recordThread.interrupt(); recordThread = null; } if(audioRecord != null){ audioRecord.stop(); audioRecord.release(); audioRecord = null; } new Thread(new Runnable() { @Override public void run() { convertAudioFiles(fileUrl,outFileUrl); } }).start(); Log.e("writeAudioToDirectory32","停止写入了"+fileUrl); } @Override public void onDestroy() { super.onDestroy(); stopRecorder(); Log.e("writeAudioToDirectory33","再写入文件:"+isRunning+"==="+songName); } //将PCM转MP3格式 public String convertAudioFiles(String src, String target){ try{ //此处代码省略,请看文章下方提供的链接! }catch (Exception ex){ ex.printStackTrace(); } return "ok"; } }
如何在代码中使用AudioRecord工具类录制手机的声音呢?代码如下:
//这是开启/关闭录音的组合开关Button按钮 public void recordUserVoice() { String luyinStr = weixin_luyin.getText().toString(); Intent intent = new Intent(getActivity(), RecorderService.class); if(luyinStr.equals("开始录音")){ //将按钮设置为关闭 weixin_luyin.setText("关闭录音"); String curr_songName = MainActivity.mainaction.tv_zhengzaibofang.getText().toString(); //传递当前歌曲名称参数(这是小编的业务需求) intent.putExtra("SONG_NAME",curr_songName); //开启录音服务 getActivity().startService(intent); }else{ weixin_luyin.setText("开始录音"); //关闭录音服务 getActivity().stopService(intent); } }
文章内提示:
由于文章中有将pcm格式的语音文件转化为MP3格式的文件,方法请参考下方链接中的工具类操作:
https://www.tpyyes.com/a/android/1028.html