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())); } }); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。