Iphone 尝试了解AVAudioPlayer和音频电平计量

Iphone 尝试了解AVAudioPlayer和音频电平计量,iphone,objective-c,xcode,ipad,avaudioplayer,Iphone,Objective C,Xcode,Ipad,Avaudioplayer,我试图了解AVAudioPlayer和音频电平计量。我下面有一个对象“AudioPlayer”,它正在播放短音频。现在我想输出这个声音的功率(分贝)。不知怎的,我觉得我做得不对 audioPlayer.meteringEnabled = YES; [audioPlayer play]; int channels = audioPlayer.numberOfChannels; [audioPlayer updateMeters];

我试图了解AVAudioPlayer和音频电平计量。我下面有一个对象“AudioPlayer”,它正在播放短音频。现在我想输出这个声音的功率(分贝)。不知怎的,我觉得我做得不对

        audioPlayer.meteringEnabled = YES;
        [audioPlayer play];
        int channels = audioPlayer.numberOfChannels;
        [audioPlayer updateMeters];
        for (int i=0; i<channels; i++) {
            //Log the peak and average power
            NSLog(@"%d %0.2f %0.2f", i, [audioPlayer peakPowerForChannel:0],[audioPlayer averagePowerForChannel:0]);
audioPlayer.meteringEnabled=是;
[音频播放器播放];
int channels=audioPlayer.numberOfChannels;
[音频播放器更新程序];

对于(int i=0;i您正在更新,然后几乎在声音开始后立即询问仪表的值-
updateMeters
可能在您发送
play
后的几十毫秒内运行。因此,如果剪辑开始时有任何静音,您很可能得到正确的读数。您应该尝试延迟检查,您可能还需要在检查值之前,在循环内部发送
updateMeters

您也从未实际获得通道>0的仪表值,因为无论
i
的值在循环中是什么,您都会通过0。我想您的意思是:

for (int currChan = 0; currChan < channels; currChan++) {
    //Log the peak and average power
    NSLog(@"%d %0.2f %0.2f", currChan, [audioPlayer peakPowerForChannel:currChan], [audioPlayer averagePowerForChannel:currChan]);
}
for(int currChan=0;currChan
您的代码有几个问题-雅克已经指出了其中的大部分问题

每次读取值之前,必须调用
[audioPlayer updateMeters];
。 您最好实例化一个
NSTimer

在类
@interface
中声明一个iVar
NSTimer*playerTimer;

另外,在你的类中采用
也没有什么坏处,这样你就可以在玩家玩完游戏后使计时器失效

然后将代码更改为:

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;
}
-(无效)监视器音频播放器
{   
[音频播放器更新程序];
    
对于(int i=0;i