Android開發(fā)中悼沿,MediaRecorder錄制音頻文件。

一骚灸、錄制工具類

public class MediaRecordingUtils {

private static final StringTAG ="MediaRecordingUtils";

private StringfilePath;

private Filefile;

private long startTime;

private long endTime;

private int BASE =1;

private int SPACE =100;

private MediaRecordermMediaRecorder;

private static final int MAX_LENGTH =1000 *60 *200;// 最大錄音時長糟趾,單位毫秒,1000*60*10;

? ? private OnAudioStatusUpdateListeneraudioStatusUpdateListener;

private final HandlermHandler =new Handler();

private RunnablemUpdateMicStatusTimer =new Runnable() {

public void run() {

updateMicStatus();

}

};

private boolean isRecording =false;

/**

? ? * @param audioStatusUpdateListener

? ? */

? ? public MediaRecordingUtils(OnAudioStatusUpdateListener audioStatusUpdateListener) {

this.audioStatusUpdateListener = audioStatusUpdateListener;

}

/**

? ? * @return 開始錄音 使用aac格式

*/

? ? public void startRecord(String path) {

if (mMediaRecorder ==null)

mMediaRecorder =new MediaRecorder();

try {

file =new File(path +getTimeFolder()+getData() +".aac");

this.filePath =file.getPath();

Log.e(TAG,"開始錄音");

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

mMediaRecorder.setOutputFile(file);//設(shè)置錄音文件輸出

? ? ? ? ? ? mMediaRecorder.setMaxDuration(MAX_LENGTH);

mMediaRecorder.prepare();

mMediaRecorder.start();

isRecording =true;

startTime = System.currentTimeMillis();

updateMicStatus();

}catch (IOException e) {

e.printStackTrace();

}

}

/**

* 停止錄音

*/

? ? public long stopRecord() {

isRecording =false;

if (mMediaRecorder ==null)

return 0L;

endTime = System.currentTimeMillis();

Log.e(TAG,"停止錄音");

try {

mMediaRecorder.stop();

mMediaRecorder.reset();

mMediaRecorder.release();

mMediaRecorder =null;

audioStatusUpdateListener.onStop(filePath);

filePath ="";

}catch (RuntimeException e) {

try {

mMediaRecorder.reset();

mMediaRecorder.release();

mMediaRecorder =null;

deleteFile(filePath);

}catch (Exception e1) {

e1.printStackTrace();

}

}

return endTime -startTime;

}

/**

* 取消錄音

*/

? ? public void cancelRecord() {

Log.e(TAG,"取消錄音");

isRecording =false;

try {

if (mMediaRecorder !=null) {

mMediaRecorder.stop();

mMediaRecorder.reset();

mMediaRecorder.release();

mMediaRecorder =null;

}

}catch (RuntimeException e) {

if (mMediaRecorder !=null) {

mMediaRecorder.reset();

mMediaRecorder.release();

mMediaRecorder =null;

}

}

deleteFile(filePath);

}

/**

* 更新麥克狀態(tài)

*/

? ? private void updateMicStatus() {

if (mMediaRecorder !=null) {

double ratio = (double)mMediaRecorder.getMaxAmplitude() /BASE;

double db =0;// 分貝

? ? ? ? ? ? if (ratio >1) {

db =20 * Math.log10(ratio);

if (null !=audioStatusUpdateListener) {

audioStatusUpdateListener.onUpdate(db, System.currentTimeMillis() -startTime);

}

}

mHandler.postDelayed(mUpdateMicStatusTimer,SPACE);

}

}

//獲取時間戳

? ? private static String getData() {

Date date =new Date();

SimpleDateFormat dateFormat =new SimpleDateFormat("YYYYMMdd_HH_mm_ss");

String time = dateFormat.format(date);

return time;

}

/**

? ? * @param path 刪除文件

*/

? ? private void deleteFile(String path) {

try {

if (path !=null) {

File file =new File(path);

if (file.exists()) {

file.delete();

}

filePath ="";

}

}catch (Exception e) {

e.printStackTrace();

}

}

//存儲視頻時按照當(dāng)天日期分文件夾進行存儲

? ? private String getTimeFolder() {

Date date =new Date();

SimpleDateFormat dateFormat =new SimpleDateFormat("YYYYMMdd");

String time = dateFormat.format(date);

boolean orExistsDir = FileUtils.createOrExistsDir(Constants.audioPath + time +"/");

if (orExistsDir) {

return time +"/";

}else {

return "";

}

}

//是否正在錄音

? ? public boolean isRecording() {

return isRecording;

}

//錄音狀態(tài)回調(diào)接口

? ? public interface OnAudioStatusUpdateListener {

/**

? ? ? ? * @param db? 當(dāng)前聲音分貝

? ? ? ? * @param time 錄音時長

*/

? ? ? ? public void onUpdate(double db,long time);

/**

? ? ? ? * @param filePath 停止錄音 保存路徑

*/

? ? ? ? public void onStop(String filePath);

}

}


二甚牲、根據(jù)不同需求义郑,自定義調(diào)用邏輯即可,注意容錯性處理丈钙。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末非驮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子雏赦,更是在濱河造成了極大的恐慌劫笙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件星岗,死亡現(xiàn)場離奇詭異填大,居然都是意外死亡,警方通過查閱死者的電腦和手機伍茄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門栋盹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敷矫,你說我怎么就攤上這事例获。” “怎么了曹仗?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵榨汤,是天一觀的道長。 經(jīng)常有香客問我怎茫,道長收壕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任轨蛤,我火速辦了婚禮蜜宪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祥山。我一直安慰自己圃验,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布缝呕。 她就那樣靜靜地躺著澳窑,像睡著了一般斧散。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摊聋,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天鸡捐,我揣著相機與錄音,去河邊找鬼麻裁。 笑死箍镜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悲立。 我是一名探鬼主播鹿寨,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼薪夕!你這毒婦竟也來了脚草?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤原献,失蹤者是張志新(化名)和其女友劉穎馏慨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姑隅,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡写隶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了讲仰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慕趴。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鄙陡,靈堂內(nèi)的尸體忽然破棺而出冕房,到底是詐尸還是另有隱情,我是刑警寧澤趁矾,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布耙册,位于F島的核電站,受9級特大地震影響毫捣,放射性物質(zhì)發(fā)生泄漏详拙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一蔓同、第九天 我趴在偏房一處隱蔽的房頂上張望饶辙。 院中可真熱鬧,春花似錦斑粱、人聲如沸畸悬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹋宦。三九已至,卻和暖如春咒锻,著一層夾襖步出監(jiān)牢的瞬間冷冗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工惑艇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒿辙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓滨巴,卻偏偏與公主長得像思灌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恭取,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356