2013-02-13 13 views
6

Mam wiele filmów, które wyświetlam w UITableView. Filmy są przechowywane zdalnie na serwerze. Jestem w stanie załadować wideo do widoku tabeli za pomocą następującego kodu.Jak cacheować AVPlayerItem (wideo) do ponownego użycia w UITableview

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

Za każdym razem, gdy tabela odkłada komórkę, a następnie ponownie wymaga, wideo jest ponownie ładowane z adresu URL. Zastanawiam się, czy istnieje sposób na pobranie i zapisanie w pamięci podręcznej lub zapisanie wideo, aby można go było odtwarzać z telefonu bez konieczności ponownego połączenia. Próbowałem narysować technikę zastosowaną w przykładzie dostarczonym przez Apple, ale trochę utknąłem.

+0

Czy kiedykolwiek zastanawiałeś się, jak to zrobić? – user3344977

Odpowiedz

2

Jest jedna metoda, aby to zrobić, ale może to być opodatkowanie starszych urządzeń, a następnie spowodować odrzucenie aplikacji przez MediaServerD.

Po utworzeniu, zapisz każdego gracza na NSMutableArray. Każdy indeks w tablicy powinien odpowiadać indexPath.row z UITableView.

4

Po tym, jak niepotrzebnie próbowałem cacheować AVPlayerItems, doszedłem do wniosku, że działa znacznie lepiej, jeśli buforujesz bazowy zestaw AVA AVPlayerItem, który ma być ponownie użyty, podczas gdy sam AVPlayerItem nie jest przeznaczony do ponownie wykorzystane.

+1

Czy możesz wysłać przykładowy kod lub opisać kroki, jak wykonać pamięć podręczną za pomocą zestawu AVA? – Infaz

+0

"Element AVPlayerItem nie jest przeznaczony do ponownego użycia" część odpowiedzi pomogła mi. –

0

Właśnie pracowałem nad tym problemem z przyjacielem wczoraj. Kod, którego używaliśmy w zasadzie używa wbudowanego systemu buforowania NSURLSession, aby zapisać dane wideo. Oto ona:

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]; 

Po drugie, musisz ustawić konfigurację buforowania dla NSURLSession. Moja KHURLSessionManager dba o to z następującego kodu:

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

Wreszcie, należy upewnić się, że skrzynka jest wystarczająco duży dla plików, kładę następujących w moim AppDelegate.

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

Mam nadzieję, że to pomoże.

+0

to wygląda na dobry kod. Ale czy naprawdę potrzebujesz NSURLSession, aby zapisać na dysku lokalnym? Dlaczego po prostu nie użyć AVAssetExportSession? – joey

Powiązane problemy