今天工作上需要做一個(gè)一邊錄音一邊播放的功能,大致原因是有一個(gè)外部設(shè)備輸入音頻到我們機(jī)器,然后我們機(jī)器需要馬上把音頻播放出來。所以了解了一些有關(guān)錄音和播放的知識(shí)。接到這個(gè)任務(wù)的第一反應(yīng)就是看看Android源碼里面的錄音Demo,因此今天針對(duì)Android的錄音demo程序講解一些錄音和播放相關(guān)知識(shí)。
今天主要講解一下使用MediaRecorder 實(shí)現(xiàn)錄音,主要是參照Android官網(wǎng)介紹來說明。
這個(gè)程序并不能實(shí)現(xiàn)一邊錄音一邊播放,下一篇文章我再說如何解決這問題。下面是我們今天要講解的Mediarecorder的狀態(tài)機(jī)圖。摘錄自Android官網(wǎng)。
(PS:新建的QQ群,有興趣可以加入一起討論:Android群:322599434)
1、使用Mediarecorder 錄音
MediaRecorder類用來進(jìn)行媒體采樣,包括音頻和視頻。也就是用來記錄音頻和視頻方法的類,記錄的數(shù)據(jù)一般都是寫入到文件里面。因此我們可以通過這個(gè)類實(shí)現(xiàn)錄音和錄視頻的功能。下面介紹MediaRecorder用來錄音的簡(jiǎn)單方法:
MediaRecorder recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(PATH_NAME); recorder.prepare(); recorder.start(); // 開始錄音 ... recorder.stop(); recorder.reset(); // You can reuse the object by going back to setAudioSource() step recorder.release(); // Now the object cannot be reused
上面是使用MediaRecorder錄音的簡(jiǎn)單流程代碼,基本上你使用的代碼,就能實(shí)現(xiàn)錄音的功能。
2、MediaRecorder 相關(guān)的類
//Edited by mythou
//http://www.cnblogs.com/mythou/
//定義音頻編碼 class MediaRecorder.AudioEncoder //定義聲音資源 class MediaRecorder.AudioSource //回調(diào)接口,當(dāng)錄音出現(xiàn)錯(cuò)誤的時(shí)候調(diào)用 interface MediaRecorder.OnErrorListener //回調(diào)接口,當(dāng)錄音出現(xiàn)錯(cuò)誤的時(shí)候調(diào)用 interface MediaRecorder.OnInfoListener //定義輸出格式 class MediaRecorder.OutputFormat //定義視頻編碼 class MediaRecorder.VideoEncoder //定義視頻source class MediaRecorder.VideoSource
3、MediaRecorder常用方法
//獲取音頻信號(hào)源的最高值。 final static int getAudioSourceMax() //最后調(diào)用這個(gè)方法采樣的時(shí)候返回最大振幅的絕對(duì)值 int getMaxAmplitude() //準(zhǔn)備recorder 開始捕獲和編碼數(shù)據(jù) void prepare() //發(fā)布與此MediaRecorder對(duì)象關(guān)聯(lián)的資源 void release() //重新啟動(dòng)mediarecorder到空閑狀態(tài) void reset() //設(shè)置錄制的音頻通道數(shù)。 void setAudioChannels(int numChannels) //設(shè)置audio的編碼格式 void setAudioEncoder(int audio_encoder) //設(shè)置錄制的音頻編碼比特率 void setAudioEncodingBitRate(int bitRate) //設(shè)置錄制的音頻采樣率。 void setAudioSamplingRate(int samplingRate) //設(shè)置用于錄制的音源。 void setAudioSource(int audio_source) //輔助時(shí)間的推移視頻文件的路徑傳遞。 void setAuxiliaryOutputFile(String path) void setAuxiliaryOutputFile(FileDescriptor fd) //在文件描述符傳遞的輔助時(shí)間的推移視頻 //設(shè)置一個(gè)recording的攝像頭 void setCamera(Camera c) //設(shè)置視頻幀的捕獲率 void setCaptureRate(double fps) //設(shè)置記錄會(huì)話的最大持續(xù)時(shí)間(毫秒) void setMaxDuration(int max_duration_ms) //設(shè)置記錄會(huì)話的最大大�。ㄒ宰止�(jié)為單位) void setMaxFileSize(long max_filesize_bytes) //注冊(cè)一個(gè)回調(diào)被調(diào)用發(fā)生錯(cuò)誤時(shí),同時(shí)錄制 void setOnErrorListener(MediaRecorder.OnErrorListener l) //注冊(cè)要同時(shí)記錄一個(gè)信息事件發(fā)生時(shí)調(diào)用的回調(diào)。 void setOnInfoListener(MediaRecorder.OnInfoListener listener) //設(shè)置輸出的視頻播放的方向提示 void setOrientationHint(int degrees) //傳遞要寫入的文件的文件描述符 void setOutputFile(FileDescriptor fd) //設(shè)置輸出文件的路徑 void setOutputFile(String path) //設(shè)置在錄制過程中產(chǎn)生的輸出文件的格式 void setOutputFormat(int output_format) //表面設(shè)置顯示記錄媒體(視頻)的預(yù)覽 void setPreviewDisplay(Surface sv) //從一個(gè)記錄CamcorderProfile對(duì)象的使用設(shè)置 void setProfile(CamcorderProfile profile) //設(shè)置視頻編碼器,用于錄制 void setVideoEncoder(int video_encoder) //設(shè)置錄制的視頻編碼比特率 void setVideoEncodingBitRate(int bitRate) //設(shè)置要捕獲的視頻幀速率 void setVideoFrameRate(int rate) //設(shè)置要捕獲的視頻的寬度和高度 void setVideoSize(int width, int height) //開始捕捉和編碼數(shù)據(jù)到setOutputFile(指定的文件) void setVideoSource(int video_source) //開始錄音 void start() //停止recording void stop()
4、播放錄音
mPlayer = new MediaPlayer(); mPlayer.setDataSource(mSampleFile.getAbsolutePath()); mPlayer.setOnCompletionListener(this); mPlayer.setOnErrorListener(this); mPlayer.prepare(); mPlayer.start(); //....... mPlayer.stop(); mPlayer.release(); mPlayer = null;
上面是一段簡(jiǎn)單播放錄音的過程,結(jié)合上面錄音代碼,就可以實(shí)現(xiàn)錄音和回放。
MediaRecorder的使用方法很簡(jiǎn)單,最后給出Android源碼里面的錄音程序,方便有需要的朋友下載看看。下一篇文章再講解如何實(shí)現(xiàn)一邊錄音一邊播放功能。
Android錄音程序下載:http://pan.baidu.com/share/link?shareid=3363643796&uk=85241834