2012-05-18 16 views
15

मैं जो कर रहे हैं AVPlayer से संबंधित कुछ सवाल हैं:AVPlayer बफरिंग को रोक कर अधिसूचना, और पोस्टर फ्रेम

  1. जब हम थामने [player pause] के माध्यम से AVPlayerAVPlayer रखने नेटवर्क से वीडियो बफरिंग करता है या यह सिर्फ करता है रुकें? मुझे सेब के दस्तावेज में इससे संबंधित कोई जानकारी नहीं मिली। साथ ही, एवीप्लेयर को रोकते समय बफरिंग को मजबूर करना संभव है, ताकि अगर हमारे पास विरामित वीडियो पहले वीडियो को समाप्त होने की प्रतीक्षा में है तो हमें वीडियो के बीच कोई अंतर नहीं मिलेगा?

  2. AVPlayer को रोकने पर हमारे पास [player pause] पर कोई ईवेंट हो सकता है।

  3. क्या हम अभी भी कुछ सेकंड के लिए AVPlayer पर छवि दिखा सकते हैं?

धन्यवाद

+0

बहु-आइटम क्रमिक अंतराल प्लेबैक के लिए AVQueuePlayer देखें। – MikeyWard

+0

इसे पहले से ही इस्तेमाल किया गया है, यह स्ट्रीम किए गए ऑडियो/वीडियो सामग्री को संभाल नहीं करता है, मैंने इसे पहले से ही AVPlayer का उपयोग करके किया है। धन्यवाद –

+0

@OmerWaqasKhan अपने ऐप के नेटवर्क पैकेट का निरीक्षण करने के लिए चार्ल्स का उपयोग करें, और आप देख सकते हैं कि – onmyway133

उत्तर

35

1) AVPlayer कई मामलों में वीडियो बफ़र होगा, कोई नहीं Cleary प्रलेखित। मैं कहूंगा कि जब आप वीडियो में प्रवेश करते हैं, और जब आप वर्तमान आइटम को प्रतिस्थापित करते हैं तो आप बफरिंग की उम्मीद कर सकते हैं। क्या हो रहा है यह जानने के लिए आप currentItem.loadedTimeRanges देख सकते हैं। वह संपत्ति आपको बताएगी कि कौन सी वीडियो समय सीमाएं लोड की गई हैं।

इसके अलावा, कुछ अन्य currentItem गुण हैं जो आपकी मदद कर सकते हैं: playbackLikelyToKeepUp, playbackBufferFull और playbackBufferEmpty

एक परिपूर्ण अंतराल प्लेबैक प्राप्त करना आसान नहीं है।

/* player is an instance of AVPlayer */ 
[player addObserver:self 
     forKeyPath:@"currentItem.loadedTimeRanges" 
      options:NSKeyValueObservingOptionNew 
      context:kTimeRangesKVO];  

observeValueForKeyPath:ofObject:change:context: में:

if (kTimeRangesKVO == context) { 
    NSArray *timeRanges = (NSArray *)[change objectForKey:NSKeyValueChangeNewKey]; 
    if (timeRanges && [timeRanges count]) { 
     CMTimeRange timerange = [[timeRanges objectAtIndex:0] CMTimeRangeValue]; 
     NSLog(@" . . . %.5f -> %.5f", CMTimeGetSeconds(timerange.start), CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration))); 
    } 
} 

2) बस player.rate पर नजर रखना।

[player addObserver:self 
     forKeyPath:@"rate" 
      options:NSKeyValueObservingOptionNew 
      context:kRateDidChangeKVO]; 
फिर अपने observeValueForKeyPath:ofObject:change:context: में

:

if (kRateDidChangeKVO == context) { 
     NSLog(@"Player playback rate changed: %.5f", player.rate); 
     if (player.rate == 0.0) { 
      NSLog(@" . . . PAUSED (or just started)"); 
     } 
    } 

3) आप build a movie of a given length using a still image कर सकते हैं, लेकिन यह खिलाड़ी के शीर्ष पर एक नियमित UIImageView उपयोग करने के लिए आसान है। आवश्यकता होने पर इसे छुपाएं/दिखाएं।

नमूना परियोजना: the code I wrote to support my answer के साथ खेलने के लिए स्वतंत्र महसूस करें।

+1

thanx madmw, और क्या हम विराम स्थिति में बफरिंग रखने के लिए avplayer को मजबूर कर सकते हैं? –

+0

AFAIK AVPlayer बफर के साथ काम करने के लिए कोई सार्वजनिक एपीआई नहीं है।यदि आप विराम बिंदु से परे बफरिंग रखना चाहते हैं तो आप नकली रोक सकते हैं: W/आउट वॉल्यूम खेलना जारी रखें और दृश्य को छुपाएं, फिर प्लेबैक को फिर से शुरू करने के लिए seekToTime का उपयोग करें। – djromero

+0

इसके लिए धन्यवाद! एक ठोस उदाहरण में बहुत मदद मिली। – user2734823

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