你的代碼有幾個問題 - 雅克已經指出了他們中的大多數。
你必須調用[audioPlayer updateMeters];
讀取值之前各一次。 您可能最好實例化一個NSTimer
。
在您的課堂上聲明iVar NSTimer *playerTimer;
@interface
。
而且它不會傷害採取<AVAudioPlayerDelegate>
在你的類,所以你就可以播放播放完畢後無效計時器。
然後更改您的代碼:
audioPlayer.meteringEnabled = YES;
audioPlayer.delegate = self;
if (!playerTimer)
{
playerTimer = [NSTimer scheduledTimerWithTimeInterval:0.001
target:self selector:@selector(monitorAudioPlayer)
userInfo:nil
repeats:YES];
}
[audioPlayer play];
這兩種方法添加到您的類:
-(void) monitorAudioPlayer
{
[audioPlayer updateMeters];
for (int i=0; i<audioPlayer.numberOfChannels; i++)
{
//Log the peak and average power
NSLog(@"%d %0.2f %0.2f", i, [audioPlayer peakPowerForChannel:i],[audioPlayer averagePowerForChannel:i]);
}
}
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
NSLog (@"audioPlayerDidFinishPlaying:");
[playerTimer invalidate];
playerTimer = nil;
}
,你應該是好去。