首先加入 AVFoundation.framework 與 CoreAudio.framework,需要用裡面的 AVAudioRecorder Class 來偵測

850A69F536E2888FD509F6E11363FD  



接下來需要引入一些程式中會使用到類別

 

#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>

 

宣告一個 AVAudioRecorder 和 NSTimer

 

AVAudioRecorder *Recorder;
NSTimer *Timer;

 

宣告完成後我們要運用
AVAudioRecorder 中的一些物件和方法來進行實作

 

NSURL *url=[NSURL fileURLWithPath:@"/dev/null"];

 

//以下宣告的set可以參照Apple的Settings檔
NSDictionary *set = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat:44100.0],
AVSampleRateKey,
[NSNumber numberWithInt:kAudioFormatAppleLossless],
AVFormatIDKey,
[NSNumber numberWithInt:1],
AVNumberOfChannelsKey,
[NSNumber numberWithInt:AVAudioQualityMax],
AVEncoderAudioQualityKey,
nil];

 

NSError *error;
Recorder=[[AVAudioRecorder alloc] initWithURL:url settings:set error:&error];

 

//若初始化成功則利用NSTimer來持續偵測聲音
if (Recorder) {
[Recorder prepareToRecord];
Recorder.meteringEnabled=YES;
[Recorder record];

 

Timer=[NSTimer scheduledTimerWithTimeInterval:0.3
target:self
selector:@selector(TimerCallback:)
userInfo:nil repeats:YES];
}
else {
NSLog(@"error");
}

 

需要注意的是 [Recorder PrepareToRecord] 必須放在 Recorder.meteringEnable 之前。 再來要設定一個 TimerCallback 方法來執行 onTimer 的內容



-(void)TimerCallback NSTimer *)timer {
[Recorder updateMeters];
NSLog(@"平均:%f 波峰:%f",[Recorder averagePowerForChannel:0],[Recorder peakPowerForChannel:0]);
}

 

在使用 [Recorder averagePowerForChannel:0] 和 [Recorder peakPowerForChannel:0] 讀取 Power 的平均和波峰前必須先用 updateMeters 更新目前麥克風收到的訊息才行,而 Power 的數值會落在 -160 dB ~ 0 dB 之間。




創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()