Android录音播放管理工具
1、语音播放直接用系统工具就好了,这个就不多说了,根据传入的路径(网络路径或本地路径均可)播放音频文件
/**
*Createdbyzhbon2017/1/16.
*音乐在线播放
*/
publicclassPlayManager{
privateContextmcontext;
publicPlayManager(Contextcontext){
this.mcontext=context;
}
publicvoidplay(Stringsong){
MediaPlayermp=newMediaPlayer();
try{
//存储在SD卡或其他文件路径下的媒体文件
//例如:mp.setDataSource("/sdcard/test.mp3");
//网络上的媒体文件
//例如:mp.setDataSource("http://www...../music/test.mp3");
mp.setDataSource(song);
mp.prepare();
mp.start();
}catch(Exceptione){
e.printStackTrace();
}
}
}
2.录制amr格式音频文件(微信语音便用的这种格式,至于音频文件格式之间的比较请自行百度)
/**
*Createdbyzhbon2017/1/16.
*本地录音
*/
publicclassRecordManager{
//录制成amr格式............................................................
privateContextmcontext;
MediaRecordermediaRecorder;
publicRecordManager(Contextcontext){
this.mcontext=context;
//TODO初始化安装路径,录音流程
}
/**开始录制*/
publicvoidstart_amr(){
mediaRecorder=newMediaRecorder();
/**
*mediaRecorder.setAudioSource设置声音来源。
*MediaRecorder.AudioSource这个内部类详细的介绍了声音来源。
*该类中有许多音频来源,不过最主要使用的还是手机上的麦克风,MediaRecorder.AudioSource.MIC
*/
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
/**
*mediaRecorder.setOutputFormat代表输出文件的格式。该语句必须在setAudioSource之后,在prepare之前。
*OutputFormat内部类,定义了音频输出的格式,主要包含MPEG_4、THREE_GPP、RAW_AMR……等。
*/
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
/**
*mediaRecorder.setAddioEncoder()方法可以设置音频的编码
*AudioEncoder内部类详细定义了两种编码:AudioEncoder.DEFAULT、AudioEncoder.AMR_NB
*/
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
/**
*设置录音之后,保存音频文件的位置,一般是SD卡的位置
*/
mediaRecorder.setOutputFile(String.valueOf(PathManger.getVoicePath()));
/**
*调用start开始录音之前,一定要调用prepare方法。
*/
try{
mediaRecorder.prepare();
mediaRecorder.start();
}
catch(IllegalStateExceptione){
e.printStackTrace();
}
catch(IOExceptione){
e.printStackTrace();
}
}
/**停止录音*/
publicvoidstop_amr(){
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder=null;
}
/**重置录音*/
publicvoidreset_amr(){
mediaRecorder.reset();
}
}
3、配置转换工具包(这个比较简单,配置以下文件即可)
添加flame.jar,并在armeabi和armeabi-v7a文件夹添加libmp3lame.so
资源文件:http://xiazai.jb51.net/201701/yuanma/androidlibmp3lame(jb51.net).rar
4、录制MP3格式音频文件(个人觉得这种格式能比较好的统一Android端和iOS端的音频文件,虽然方法相对比较繁杂一些)
/**
*Createdbyzhbon2017/1/16.
*本地录音
*/
publicclassRecordManager{
//录制成MP3格式..............................................
/**构造时候需要的Activity,主要用于获取文件夹的路径*/
privateActivityactivity;
/**文件代号*/
publicstaticfinalintRAW=0X00000001;
publicstaticfinalintMP3=0X00000002;
/**文件路径*/
privateStringrawPath=null;
privateStringmp3Path=null;
/**采样频率*/
privatestaticfinalintSAMPLE_RATE=11025;
/**录音需要的一些变量*/
privateshort[]mBuffer;
privateAudioRecordmRecorder;
/**录音状态*/
privatebooleanisRecording=false;
/**是否转换ok*/
privatebooleanconvertOk=false;
publicRecordManager(Activityactivity,StringrawPath,Stringmp3Path){
this.activity=activity;
this.rawPath=rawPath;
this.mp3Path=mp3Path;
}
/**开始录音*/
publicbooleanstart_mp3(){
//如果正在录音,则返回
if(isRecording){
returnisRecording;
}
//初始化
if(mRecorder==null){
initRecorder();
}
getFilePath();
mRecorder.startRecording();
startBufferedWrite(newFile(rawPath));
isRecording=true;
returnisRecording;
}
/**停止录音,并且转换文件,这很可能是个耗时操作,建议在后台中做*/
publicbooleanstop_mp3(){
if(!isRecording){
returnisRecording;
}
//停止
mRecorder.stop();
isRecording=false;
//TODO
//开始转换
FLameUtilslameUtils=newFLameUtils(1,SAMPLE_RATE,96);
convertOk=lameUtils.raw2mp3(rawPath,mp3Path);
returnisRecording^convertOk;//convertOk==true,returntrue
}
/**获取文件的路径*/
publicStringgetFilePath(intfileAlias){
if(fileAlias==RAW){
returnrawPath;
}elseif(fileAlias==MP3){
returnmp3Path;
}else
returnnull;
}
/**清理文件*/
publicvoidcleanFile(intcleanFlag){
Filef=null;
try{
switch(cleanFlag){
caseMP3:
f=newFile(mp3Path);
if(f.exists())
f.delete();
break;
caseRAW:
f=newFile(rawPath);
if(f.exists())
f.delete();
break;
caseRAW|MP3:
f=newFile(rawPath);
if(f.exists())
f.delete();
f=newFile(mp3Path);
if(f.exists())
f.delete();
break;
}
f=null;
}catch(Exceptione){
e.printStackTrace();
}
}
/**关闭,可以先调用cleanFile来清理文件*/
publicvoidclose(){
if(mRecorder!=null)
mRecorder.release();
activity=null;
}
/**初始化*/
privatevoidinitRecorder(){
intbufferSize=AudioRecord.getMinBufferSize(SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
mBuffer=newshort[bufferSize];
mRecorder=newAudioRecord(MediaRecorder.AudioSource.MIC,SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT,
bufferSize);
}
/**设置路径,第一个为raw文件,第二个为mp3文件*/
privatevoidgetFilePath(){
try{
Stringfolder="audio_recorder_2_mp3";
StringfileName=String.valueOf(System.currentTimeMillis());
if(rawPath==null){
Fileraw=newFile(activity.getDir(folder,
activity.MODE_PRIVATE),fileName+".raw");
raw.createNewFile();
rawPath=raw.getAbsolutePath();
raw=null;
}
if(mp3Path==null){
Filemp3=newFile(activity.getDir(folder,
activity.MODE_PRIVATE),fileName+".mp3");
mp3.createNewFile();
mp3Path=mp3.getAbsolutePath();
mp3=null;
}
Log.d("rawPath",rawPath);
Log.d("mp3Path",mp3Path);
runCommand("chmod777"+rawPath);
runCommand("chmod777"+mp3Path);
}catch(Exceptione){
e.printStackTrace();
}
}
/**执行cmd命令,并等待结果*/
privatebooleanrunCommand(Stringcommand){
booleanret=false;
Processprocess=null;
try{
process=Runtime.getRuntime().exec(command);
process.waitFor();
ret=true;
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
process.destroy();
}catch(Exceptione){
e.printStackTrace();
}
}
returnret;
}
/**写入到raw文件*/
privatevoidstartBufferedWrite(finalFilefile){
newThread(newRunnable(){
@Override
publicvoidrun(){
DataOutputStreamoutput=null;
try{
output=newDataOutputStream(newBufferedOutputStream(
newFileOutputStream(file)));
while(isRecording){
intreadSize=mRecorder.read(mBuffer,0,
mBuffer.length);
for(inti=0;i<readSize;i++){
output.writeShort(mBuffer[i]);
}
}
}catch(IOExceptione){
e.printStackTrace();
}finally{
if(output!=null){
try{
output.flush();
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
output.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
}
}).start();
}
}
5、最后在自己想调用的地方调用就好了,PathManger这个是我自己的路径管理工具,这里不贴了,反正自己直接放一个路径字符串进去就好了
/**初始化语音*/
privatevoidinitVoice(){
//录音
RecordManager=newRecordManager(
CallHelpActivity.this,
String.valueOf(PathManger.getVoicePathToRaw()),
String.valueOf(PathManger.getVoicePathToMp3()));
callHelp_Voice_longclick.setOnTouchListener(newView.OnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
RecordManager.start_mp3();
break;
caseMotionEvent.ACTION_MOVE:
break;
caseMotionEvent.ACTION_UP:
RecordManager.stop_mp3();
break;
}
returnfalse;
}
});
//语音播放
finalPlayManagerPlayManager=newPlayManager(this);
callHelp_Voice_click.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
PlayManager.play(String.valueOf(PathManger.getVoicePathToMp3()));
}
});
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
