編輯:Android開發實例
Android 上有一些很有趣的應用,例如《吹裙子》、《吹氣球》之類的。利用的是實時獲取麥克風輸入音量,然後進行相應的處理。錄音過程中怎樣獲得聲音的大小呢?網上也不少人問如何處理這個事情,也有一些解答,不過都沒有實際的代碼。簡單摸索了一下,寫了個小 Demo 試了試,果然可以。給大家共享一下。
不解釋代碼了,大家看注釋。
package
com.xxiyy.spl;
import
android.media.AudioFormat;
import
android.media.AudioRecord;
import
android.media.MediaRecorder;
import
android.util.Log;
public
class
RecordThread
extends
Thread {
private
AudioRecord ar;
private
int
bs;
private
static
int
SAMPLE_RATE_IN_HZ =
8000
;
private
boolean
isRun =
false
;
public
RecordThread() {
super
();
bs = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
ar =
new
AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, bs);
}
public
void
run() {
super
.run();
ar.startRecording();
// 用於讀取的 buffer
byte
[] buffer =
new
byte
[bs];
isRun =
true
;
while
(isRun) {
int
r = ar.read(buffer,
0
, bs);
int
v =
0
;
// 將 buffer 內容取出,進行平方和運算
for
(
int
i =
0
; i < buffer.length; i++) {
// 這裡沒有做運算的優化,為了更加清晰的展示代碼
v += buffer[i] * buffer[i];
}
// 平方和除以數據總長度,得到音量大小。可以獲取白噪聲值,然後對實際采樣進行標准化。
// 如果想利用這個數值進行操作,建議用 sendMessage 將其拋出,在 Handler 裡進行處理。
Log.d(
"spl"
, String.valueOf(v / (
float
) r));
}
ar.stop();
}
public
void
pause() {
// 在調用本線程的 Activity 的 onPause 裡調用,以便 Activity 暫停時釋放麥克風
isRun =
false
;
}
public
void
start() {
// 在調用本線程的 Activity 的 onResume 裡調用,以便 Activity 恢復後繼續獲取麥克風輸入音量
if
(!isRun) {
super
.start();
}
}
}
公司最近也開始基於android4.0 ICS修改框架了,公司的手機暫時不適合拿回家測試,也沒有kernel的權限。從個人的角度看,我手上現在有兩部手機,一部是H
前言 Content Provider為存儲數據和獲取數據提
自定義控件(類似按鈕等)的使用,自定義一個SurfaceView。 如某一塊的動態圖(自定義相應),或者類似UC浏覽器下面的工具欄。 如下圖示例: 自
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個