前兩篇文章寫(xiě)得是AVAudioPlayer
和AVAudioRecoder
,他們共同有一個(gè)非常強(qiáng)大的功能,那就是咱們今天討論的--音頻計(jì)量
我們將會(huì)使用到- (float)averagePowerForChannel:(NSUInteger)channelNumber;
和- (float)peakPowerForChannel:(NSUInteger)channelNumber;
這兩個(gè)方法, 第一個(gè)方法返回的的是指定信號(hào)通道的音頻功率峰值, 而第二個(gè)方法返回得失音頻功率的平均值.
調(diào)用上面這兩個(gè)方法之前, 首先有兩點(diǎn)值得注意一下:
-
AVAudioPlayer
或者AVAudioRecoder
的meteringEnabled
屬性一定要賦值為YES
, 否則不能返回正確的音頻功率值(iOS平臺(tái)上回一直返回 -160). -
- (void)updateMeters;
方法,用于刷新音頻功率的數(shù)據(jù), 使每次我們獲取到的音頻功率都是最新值.
API相當(dāng)簡(jiǎn)潔, 廢話(huà)少說(shuō), 上代碼.
這個(gè)是以 AVAudioRecoder
為例子, AVAudioPlayer
同理.
// 配置 AudioRecorder
- (void)configurationRecorder {
// 創(chuàng)建AudioRecorder就不多說(shuō)了,上一篇文章有詳細(xì)講解
NSURL *url = [NSURL fileURLWithPath: @"你的路徑/錄音名稱(chēng).acc"];
NSDictionary *setting = @{
AVNumberOfChannelsKey: @1,
AVSampleRateKey: @44100,
AVFormatIDKey:@(kAudioFormatMPEG4AAC)
};
NSError *error = nil;
self.recorder = [[AVAudioRecorder alloc] initWithURL:url settings:setting error:&error];
if (error ) {
NSLog(@"Error: %@", error);
}
[self.recorder prepareToRecord];
// 這個(gè)屬性上面一定要置為YES 才能開(kāi)啟音頻計(jì)量
self.recorder.meteringEnabled = YES;
}
// 開(kāi)始刷新計(jì)量
- (void)startMeterTimmer {
[self.recorder record]; // 開(kāi)始錄制
[self.timer invalidate];
self.timer = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateMeter)]; 反復(fù)調(diào)用獲取當(dāng)前音頻功率值
self.timer.frameInterval = 5; // CADisplayLink 會(huì)以屏幕刷新率調(diào)用方法, iPhone是60Hz 我們這里只需要刷新率的五分之一就可以滿(mǎn)足需求了, 也可以自己修改.
[self.timer addToRunLoop:[NSRunLoop currentRunLoop] forMode: NSRunLoopCommonModes];
}
// 停止刷新計(jì)量
- (void)stopMeterTimer {
[self.recorder stop];
[self.timer invalidate];
self.timer = nil;
}
// 刷新計(jì)量
- (void)updateMeter {
[self.recorder updateMeters]; // 獲取計(jì)量之前調(diào)用
CGFloat averagePower = [self.recorder averagePowerForChannel:0];
CGFloat peakPower = [self.recorder peakPowerForChannel:0];
NSLog(@"averagePower: %f -- peakPower: %f", averagePower, peakPower);
}
獲取的音頻功率值(音頻計(jì)量)在 -160 ~ 0 之間, 安靜的辦公室一般在-80左右, 我們可以把這個(gè)值和我們項(xiàng)目需求進(jìn)行轉(zhuǎn)換(比如說(shuō)分貝...),再次就不一一贅述了.
喜歡的話(huà)給打個(gè)心心,成為我更新文章的動(dòng)力哈.