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