2012-01-25 8 views
5

सेब के दस्तावेज इसके लिए संकेत देते हैं, लेकिन आप AVPlayerItem की loadedTimeRanges प्रॉपर्टी के लिए कुंजी-मूल्य अवलोकन कैसे सेट करते हैं? वह संपत्ति एक एनएसएआरएआरई है जो परिवर्तित नहीं होती है, इसलिए आप केवल playerItem addObserver:self forKeyPath:@"loadedTimeRanges ...AVPlayerItem.loadedTimeRanges पर केवीओ संभव है?

या जब भी यह परिवर्तन हो, अधिसूचनाएं या अपडेट प्राप्त करने का कोई और तरीका उपयोग नहीं कर सकता है?

उत्तर

6

दरअसल, मैं किसी भी परेशानी के बिना लोड किए गए टाइमरेंग के लिए केवीओ का उपयोग कर रहा हूं। शायद आप सही विकल्प निर्धारित नहीं कर रहे हैं? ऐप्पल के AVPlayerDemo में कुछ कोडों में से कुछ का बहुत मामूली संशोधन है, और यह मेरे लिए काफी अच्छी तरह से काम कर रहा है।

//somewhere near the top of the file 
NSString * const kLoadedTimeRangesKey = @"loadedTimeRanges"; 
static void *AudioControllerBufferingObservationContext = &AudioControllerBufferingObservationContext; 


- (void)someFunction 
{ 
    // ... 

    //somewhere after somePlayerItem has been initialized 
    [somePlayerItem addObserver:self 
         forKeyPath:kLoadedTimeRangesKey 
          options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew 
          context:AudioControllerBufferingObservationContext]; 

    // ... 
} 

- (void)observeValueForKeyPath:(NSString*) path 
        ofObject:(id)object 
        change:(NSDictionary*)change 
        context:(void*)context 
{ 
    if (context == AudioControllerBufferingObservationContext) 
    { 
     NSLog(@"Buffering status: %@", [object loadedTimeRanges]); 
    } 
} 
+0

हाँ यह विकल्प था, मैं इसे 0 पर सेट कर रहा था। धन्यवाद! –

+0

मैंने इस समाधान verbatim कोशिश की। दुर्भाग्यवश, मुझे लोड किए गए टाइमरेन्ज के लिए प्रारंभिक केवीओ कॉल मिलता है जो एक खाली एनएसएआरआरए देता है और फिर कुछ भी नहीं। – GnarlyDog

+2

यह पता चला है कि लोड किए गए टाइमरेंग के लिए काम करने के लिए एकमात्र विकल्प NSKeyValueObservingOptionInitial था। जब UIProgressView स्क्रीन पर था, तो लोडेडटाइमरेंज संपत्ति की जांच करने के लिए मेरे लिए चारों ओर का काम एक टाइमर (कैडिसप्ले लिंक वास्तव में) का उपयोग करना था। यह काम करता है लेकिन मुझे लगता है कि मुझे लगता है। मैं बजाय केवीओ को कोई नया मूल्य चाहता हूं। – GnarlyDog

2

दाएं। loadedTimeRanges नहीं बदलता है लेकिन इसके अंदर की वस्तुएं बदलती हैं। आप प्रत्येक सेकेंड (या तो) चलाने के लिए टाइमर सेट कर सकते हैं और लोड किए गए टाइम्सरेंज के अंदर मानों का निरीक्षण कर सकते हैं। फिर आप उन परिवर्तनों को देखेंगे जिन्हें आप ढूंढ रहे हैं।

dispatch_queue_t queue = dispatch_queue_create("playerQueue", NULL); 

[player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) 
              queue:queue 
            usingBlock:^(CMTime time) { 
             for (NSValue *time in player.currentItem.loadedTimeRanges) { 
              CMTimeRange range; 
              [time getValue:&range]; 
              NSLog(@"loadedTimeRanges: %f, %f", CMTimeGetSeconds(range.start), CMTimeGetSeconds(range.duration)); 
             } 
            }]; 
+0

यह तब ट्रिगर नहीं होगा जब AVPlayer ने रोका था। – Andy

+0

@ एंडी सुनिश्चित नहीं है कि आपका क्या मतलब है। यह मेरे लिए पूरी तरह से काम करता है। लोड किए गए टाइमरेन्ज को रोका जाने पर लॉगिंग बंद हो जाएगी लेकिन जैसे ही आप फिर से शुरू करेंगे, वे लॉग इन करना जारी रखेंगे और यह स्पष्ट होगा कि रोके जाने पर मान अभी भी अद्यतन हो रहे हैं। – user3344977

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