2014-05-16 9 views
7

मैं आईओएस एप्लिकेशन में एक कस्टम वीडियो प्लेयर को लागू करने के लिए AVPlayer का उपयोग कर रहा हूं।AVPlayer/AVPlayerItem मेरे एप्लिकेशन को पहुंचने योग्य नेटवर्क विफलता के बारे में कैसे सूचित करता है?

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.URL 
options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}]; 

लोड playable कुंजी एसिंक्रोनस रूप:

NSArray *keys = @[@"playable"]; 
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     for (NSString *key in keys) { 
      NSError *error; 
      AVKeyValueStatus status = [asset statusOfValueForKey:key error:&error]; 

      if (status == AVKeyValueStatusFailed) { 
       NSLog(@"Failed to load asset key %@ error %@", key, [error localizedDescription]); 
       [self fail]; 
       return; 
      } 
     } 

     if (asset.isPlayable) { 
      [self.player replaceCurrentItemWithPlayerItem:self.playerItem]; 
     } 
     else { 
      [self fail]; 
     } 
    }); 
}]; 

समस्या है कि डिवाइस है जब

[[AVPlayer alloc] initWithURL:_URL]; 

एक परिसंपत्ति बनाएं: नेटवर्क से वीडियो चलाने के लिए मैं एक खिलाड़ी का आवंटन कोई इंटरनेट कनेक्शन या उच्च पैकेट नुकसान नहीं, completionHandler कभी भी नहीं कहा जाता है (यहां तक ​​कि मिनटों के इंतजार के बाद भी) और इसलिए मुझे नहीं पता कि लोड करने वाले उपयोगकर्ता को संदेश कब दिखाना है जी वीडियो असफल रहा।

मेरे प्रश्न हैं:

  1. Am मुझे याद आ रही कुछ/वहाँ एक बेहतर तरीका यह संभाल करने के लिए है?
  2. क्या मुझे अपना टाइमआउट तर्क रोल करना चाहिए या मुझे loadValuesAsynchronouslyForKeys: कभी नहीं करना चाहिए जब Reachability का मानना ​​है कि नेटवर्क पहुंच योग्य नहीं है।
  3. AVPlayer और नेटवर्क विफलताओं के बारे में सबसे अच्छा अभ्यास क्या हैं?

उत्तर

1

रूप AVPlayerItem पता चलता है कि कैसे बफर कर रही है की सुविधाओं, ऐसा लगता है कि इस तरह से मैं परीक्षण था से संबंधित हो सकता है। नेटवर्क लिंक कंडीशनर का उपयोग करके ब्लॉक को ट्रिगर नहीं किया गया, लेकिन जब मैंने वास्तव में चार्ल्स प्रॉक्सी का उपयोग करके मेजबान को अवरुद्ध कर दिया, तो सबकुछ इरादे से काम करता था। मैं अब के लिए अपने मूल कोड के साथ जाने की कोशिश कर रहा हूं, और दान के कुछ विचारों में जोड़ दूंगा यदि यह असली दुनिया परीक्षण के दौरान अभी भी समस्याग्रस्त साबित होता है

1

मैंने पहले AVAsset को एकीकृत किया है, लेकिन इस विशिष्ट मुद्दे में नहीं चला है। फिर भी, मैं यहां क्या करूँगा:

  1. उस समय सीमा की अवधि के लिए टाइमर या देरी ब्लॉक प्रेषण सेट करें जिसे आप लागू करना चाहते हैं।
  2. statusOfValueForKey:error: के साथ "playable" कुंजी का मान देखें।
  3. यदि स्थिति AVKeyValueStatusLoaded नहीं है या त्रुटि शून्य नहीं है, तो [asset cancelLoading] पर कॉल करें और उपयोगकर्ता को कोई त्रुटि संदेश या जो भी सफाई करने की आवश्यकता हो, उसे प्रदर्शित करें।
4

आप को देख किया जाना चाहिए (KVO) इस तरह के playbackBufferEmpty आदि

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