2013-02-13 4 views
6

Ich habe eine Reihe von Videos, die ich in einem UITableView anzeigen kann. Die Videos werden remote auf einem Server gespeichert. Ich kann die Videos mit dem folgenden Code in die Tabellenansicht laden.So speichern Sie ein AVPlayerItem (Video) zur Wiederverwendung in einem UITableview

Jedes Mal, wenn die Tabellenansicht die Zelle aus der Warteschlange nimmt, wird das Video erneut von der URL geladen. Ich frage mich, ob es eine Möglichkeit gibt, das Video herunterzuladen und zu cachen oder zu speichern, so dass es vom Telefon aus abgespielt werden kann, ohne dass man sich erneut verbinden muss. Ich habe versucht, die Technik zu zeichnen, die in dem LazyTableImages Beispiel von Apple verwendet wird, aber ich bin ein bisschen fest.

+0

Haben Sie jemals herausgefunden, wie das geht? – user3344977

Antwort

2

Es gibt eine Methode, um dies zu tun, aber es kann auf älteren Geräten besteuern, dass Ihre App später von MediaServerD über Bord geworfen wird.

Speichern Sie nach der Erstellung jeden Player in einem NSMutableArray. Jeder Index im Array sollte dem indexPath.row von UITableView entsprechen.

4

Nachdem ich erfolglos versucht habe, AVPlayerItems zu cachen, kam ich zu der Schlussfolgerung, dass es viel besser funktioniert, wenn Sie den AVPlayerItem-AVAsset, der wiederverwendet werden soll, zwischenspeichern, während das AVPlayerItem selbst nicht dazu gedacht ist wiederverwendet.

+1

Können Sie Beispielcode posten oder die Schritte zum Zwischenspeichern mit AVAsset beschreiben? – Infaz

+0

Das "AVPlayerItem ist nicht dazu gedacht, wiederverwendet zu werden" Teil dieser Antwort hat mir geholfen. –

0

Gerade an diesem Problem mit einem Freund gestern gearbeitet. Der verwendete Code verwendet im Wesentlichen das integrierte Caching-System NSURLSession, um die Videodaten zu speichern. Hier ist sie:

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

Zweitens müssen Sie die Cache-Konfiguration für die NSURLSession einzustellen. Meine KHURLSessionManager kümmert sich um diese mit dem folgenden Code:

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

Schließlich sollten Sie sicherstellen, dass Ihr Cache ist groß genug für die Dateien, habe ich folgendes in meinem AppDelegate.

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

Hoffe, das hilft.

+0

das sieht nach gutem Code aus. Aber brauchst du wirklich eine NSURLSession, um auf der lokalen Festplatte zu speichern? Warum nicht einfach eine AVAssetExportSession verwenden? – joey