2013-02-13 25 views
6

में पुन: उपयोग के लिए AVPlayerItem (वीडियो) को कैश कैसे करें मेरे पास कई वीडियो हैं जिन्हें मैं UITableView में प्रदर्शित कर रहा हूं। वीडियो को सर्वर पर दूरस्थ रूप से संग्रहीत किया जाता है। मैं निम्न में से कुछ कोड का उपयोग कर वीडियोव्यू में वीडियो लोड करने में सक्षम हूं।एक UITableview

NSString *urlString = [NSString stringWithFormat:[row objectForKey:@"video_uri"]]; 
NSURL* url = [NSURL URLWithString:urlString]; 
AVPlayerItem *pItem = [AVPlayerItem playerItemWithURL:url]; 
AVPlayer *player = [AVPlayer playerWithPlayerItem:pItem]; 

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

+0

क्या आपने कभी यह पता लगाया कि यह कैसे करें? – user3344977

उत्तर

2

ऐसा करने का एक तरीका है, लेकिन यह पुराने उपकरणों पर कर लगा सकता है जिसके बाद आपके ऐप को MediaServerD द्वारा जाया जा सकता है।

निर्माण पर, प्रत्येक खिलाड़ी को एनएसएमयूटेबलएरे में सहेजें। सरणी में प्रत्येक अनुक्रमणिका UITableView के indexPath.row से मेल खाना चाहिए।

4

AVPlayerItems को कैश करने की असफल कोशिश करने के साथ गड़बड़ करने के बाद, मैं यह निष्कर्ष निकाला हूं कि अगर आप AVPlayerItem के अंतर्निहित AVAsset को कैश करते हैं, तो इसका पुन: उपयोग किया जाता है, जबकि AVPlayerItem स्वयं का मतलब नहीं है पुन: उपयोग किया।

+1

क्या आप नमूना कोड पोस्ट कर सकते हैं या AVAsset का उपयोग करके कैश कैसे करें चरणों का वर्णन कर सकते हैं? – Infaz

+0

"एवीप्लेयर इटिम का पुन: उपयोग नहीं किया जाना चाहिए" इस जवाब के हिस्से ने मेरी मदद की। –

0

कल कल एक दोस्त के साथ इस समस्या पर काम किया। कोड का उपयोग मूल रूप से वीडियो डेटा को सहेजने के लिए एनएसआरएलएसशन बिल्ट-इन कैशिंग सिस्टम का उपयोग करता है। यहां यह है:

NSURLSession *session = [[KHURLSessionManager sharedInstance] session]; 
    NSURLRequest *req = [[NSURLRequest alloc] initWithURL:**YOUR_URL**]; 
    [[session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 


     // generate a temporary file URL 

     NSString *filename = [[NSUUID UUID] UUIDString]; 

     NSURL *temporaryDirectoryURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES]; 
     NSURL *fileURL = [[temporaryDirectoryURL URLByAppendingPathComponent:filename] URLByAppendingPathExtension:@"mp4"]; 


     // save the NSData to that URL 
     NSError *fileError; 
     [data writeToURL:fileURL options:0 error:&fileError]; 


     // give player the video with that file URL 
     AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:fileURL]; 
     AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; 
     _avMovieViewController.player = player; 
     [_avMovieViewController.player play]; 



    }] resume]; 

दूसरा, आपको NSURL सत्र के लिए कैशिंग कॉन्फ़िगरेशन सेट करने की आवश्यकता होगी। मेरे KHURLSessionManager निम्नलिखित कोड के साथ इस का ख्याल रखता है:

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    config.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad; 
    _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 

अंत में, आप सुनिश्चित करें कि आपके कैश फ़ाइलों के लिए काफी बड़ी है बनाना चाहिए, मैं अपने AppDelegate में निम्नलिखित डाल दिया।

 [NSURLCache sharedURLCache].diskCapacity = 1000 * 1024 * 1024; // 1000 MB 

उम्मीद है कि इससे मदद मिलती है।

+0

यह अच्छा कोड जैसा दिखता है। लेकिन क्या आपको स्थानीय डिस्क पर सहेजने के लिए वास्तव में NSRLSession की आवश्यकता है? क्यों न केवल AVAssetExportSession का उपयोग करें? – joey