2012-05-08 28 views
5

我想了解AVAudioPlayer和音頻電平計量。我在下面是一個播放短音頻聲音的對象「AudioPlayer」。現在我想輸出這個聲音的功率(分貝)。不知何故,我認爲我沒有這樣做。試圖瞭解AVAudioPlayer和音頻電平計量

這樣做的的NSLog輸出是 0 -160.00 -160.00 1 -160.00 -160.00

現在根據蘋果「的0分貝的返回值表示滿刻度,或最大功率;一個返回「-160 dB的值表示最小功率」那麼這是否意味着這個聲音處於最小功率?我不認爲這是真的,因爲音頻片段是一個相當響亮的聲音。我想我在這裏錯過了一些東西,任何澄清將不勝感激。

回答

3

您正在更新,然後在聲音開始後幾乎立即詢問儀表的價值 - 在發送play之後,updateMeters可能會運行幾十毫秒。所以如果在剪輯開始的時候有任何的沉默,你很可能會得到正確的閱讀。您應該嘗試延遲您的檢查,並且您可能還需要在檢查值之前發送循環內的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]); 
} 
9

你的代碼有幾個問題 - 雅克已經指出了他們中的大多數。

你必須調用[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; 
} 

,你應該是好去。