2012-05-08 15 views
5

को समझने की कोशिश कर रहा हूं मैं AVAudioPlayer और ऑडियो स्तर मीटरींग को समझने की कोशिश कर रहा हूं। मेरे पास नीचे एक ऑब्जेक्ट "ऑडियोप्लेयर" है जो एक लघु ऑडियो ध्वनि चला रहा है। अब मैं इस ध्वनि (डेसिबल) की शक्ति को आउटपुट करना चाहता हूं। किसी तरह मुझे नहीं लगता कि मैं यह सही कर रहा हूं।AVAudioPlayer और ऑडियो स्तर मीटरींग

इस के NSLog उत्पादन 0 -160,00 -160,00 1 -160,00 -160,00

अब एप्पल के लिए "0 DB के एक वापसी मान अनुसार पूर्ण पैमाने, या अधिकतम शक्ति को इंगित है, एक वापसी -160 डीबी का मूल्य न्यूनतम शक्ति इंगित करता है "तो क्या इसका मतलब यह है कि यह आवाज न्यूनतम शक्ति पर है? मुझे नहीं लगता कि यह सच है क्योंकि ऑडियो स्निपेट काफी जोरदार आवाज है। मुझे लगता है कि मैं यहां कुछ याद कर रहा हूं, किसी भी स्पष्टीकरण की सराहना की जाएगी।

उत्तर

3

आप अपडेट कर रहे हैं और फिर ध्वनि शुरू होने के तुरंत बाद मीटर के मूल्य के लिए पूछ रहे हैं - updateMeters शायद play भेजने के बाद कुछ दस मिलीसेकंड चला रहा है। तो यदि क्लिप की शुरुआत में कोई मौन है, तो आप सही पढ़ने के लिए बहुत अच्छी तरह से हो सकते हैं। आपको अपने निरीक्षण में देरी करने का प्रयास करना चाहिए, और आपको लूप के अंदर, मूल्यों का निरीक्षण करने से ठीक पहले भी भेजने की आवश्यकता हो सकती है।

आप वास्तव में कभी भी चैनल> 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 को तुरंत बंद कर देंगे।

अपनी कक्षा @interface में एक iVar NSTimer *playerTimer; घोषित करें।

इसके अलावा यह आपकी कक्षा में <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; 
} 

और तुम जाने के लिए अच्छा होना चाहिए।

संबंधित मुद्दे