使用專門的執行緒讀取資料,容易出現buffer overflow。
使用 setrecordpositionupdatelistener時,要注意兩個問題: 一:
1.啟動錄音後,要先read buffer,才會通知啟用 listener。
audiorecord.startrecording
();audiorecord
.read
(buffer,0
,buffer
.length
);
2.錄音 通知週期 及 錄音資料讀取 buffer 的設定
audiorecord.setpositionnotificationperiod
(frameperiod
);
//也可以自己指定乙個buffer大小,但是不能小於min bufferbuffersize = audiorecord.getminbuffersize(samplerate,
channelconfig, audioformat);
int
frameperiod
=frameperiod
=buffersize /(
2*bsamples
*nchannels /8
);
//讀取錄音資料 的buffer 應該為
buffersize/2,否則會出現stop後,資料延時與混亂(資料未正確寫入檔案)
buffer
=new
byte
[frameperiod
*bsamples /8
*nchannels
];//
buffer = new byte[
buffersize/2
]
二:避免錄音阻塞主線程,利用反射,更改audiorecord 物件中的
minitializationlooper(looper 物件) 屬性,為我們指定的子執行緒的 looper,然後再設定
setrecordpositionupdatelistener(這個方法中會用到
minitializationlooper 物件)
audiorecorder1
=audiorecorder1
.getinstanse
();handlerthread
handlerthread
=new
handlerthread
("handlerthread"
);handlerthread
.start
();...
//利用反射,更改屬性,為指定子執行緒的looper
field2.set(field.get(audiorecorder1), handlerthread.getlooper());
//設定監聽
audiorecorder1.prepare();
//prepare 方法的實現
public void prepare()
catch
(nosuchfieldexceptione)
catch
(illegalargumentexceptione)
catch
(illegalacces***ceptione)
**:
使用AudioRecord實現聲音採集
前言 在android開發中,實現錄音的功能一般有三種方式 1.呼叫系統的錄音器 2.使用mediarecord類實現錄音功能 3.使用audiorecord類。在這裡我就不講前兩種方式的實現了,大家可以在網上查詢相關的內容。這篇文章主要講的是使用audiorecord實現聲音採集。如果你不需要對採...
利用錄音AudioRecord實現吹一吹效果
不錯的創意,記一下,原帖原理其實就是話筒的監聽,需要在androidmanifest.xml中要加入兩個許可權 另外模擬器無法測試,只能用真機才有效果 另外 低於api 14的sdk可能無效,我測試小公尺android2.3.5似乎無效,三星9300 android4.0有效!以下是copy的 留在...
利用錄音AudioRecord實現吹一吹效果
不錯的創意,記一下,url 原帖 url 原理其實就是話筒的監聽,需要在androidmanifest.xml中要加入兩個許可權 另外模擬器無法測試,只能用真機才有效果 另外 低於api 14的sdk可能無效,我測試小公尺android2.3.5似乎無效,三星9300 android4.0有效!以下...