10

Ho letto diversi post qui sullo streaming live video/audio. Purtroppo sembra che non ci sia alcuna soluzione "buona".Riproduzione di video in UITableView

Voglio la stessa funzionalità per il video che è fornito SDWebImageView per le immagini.

In questo momento, sto usando il codice seguente: -

NSURL *url=[[NSURL alloc] initWithString:@"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"]; 
MPMoviePlayerController *moviePlayer=[[MPMoviePlayerController alloc] initWithContentURL:url]; 
moviePlayer.controlStyle=MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay=YES; 

Ma quando ho scorrere tableview, tutti i video di nuovo scaricare e ancora. So Come posso interrompere il download di?

Esiste una soluzione migliore per la riproduzione di video in UITableView? Stessa App di Facebook, Instagram e Vine con?

+3

MPMoviePlayerController e MPMoviePlayerViewController sono obsoleti poiché IOS 9 in poi. Dovresti usare un altro controller per i giocatori. Fare riferimento a https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerController_Class/ e https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerViewController_class/index.html # // apple_ref/occ/cl/MPMoviePlayerViewController – Skywalker

+0

Ok. Quindi userò AVPlayerViewController. Ma il mio problema è come posso fermarlo di nuovo e di nuovo il download di questo video a causa di Tableview .. –

+1

Penso che questa risposta aiuterà http://www.stackoverflow.com/a/14961854/5316422 – Skywalker

risposta

7

Quando si scorre la vista tabella, viene attivato il metodo -tableView:cellForRowAtIndexPath: (in realtà ogni volta che la cella sarà visibile, viene chiamato questo metodo). Credo che tu stia allocando e inizializzando il tuo MediaPlayer con questo metodo ed è per questo che il video viene scaricato di nuovo. Potresti provare ad aggiungere array e memorizzare celle già create (una sorta di cache). Quindi il tuo -tableView:cellForRowAtIndexPath dovrebbe verificare se ha sth memorizzato nella cache per l'indice reale. Se sì, mostra la cella memorizzata nella cache. Se no, allora dovrebbe creare cella, allocare e avviare il player e quindi memorizzare la cella nella cache.

mio ViewController ha proprietà: NSMutableDictionary *cache; e in ViewDidLoad ho: cache = [[NSMutableDictionary alloc] init]; mio -tableView:cellForRowAtIndexPath: assomiglia a questo:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellId = @"myCellId"; 

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; 

    if ([cache objectForKey:[NSString stringWithFormat:@"key%lu", indexPath.row]] != nil) { 
     cell = [cache objectForKey:[NSString stringWithFormat:@"key%lu", indexPath.row]]; 
    } else { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 

     AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init]; 
     playerViewController.player = [AVPlayer playerWithURL:[[NSURL alloc] initWithString:@"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"]]; 
     [cell addSubview:playerViewController.view]; 
     [cache setValue:cell forKey:[NSString stringWithFormat:@"key%lu", indexPath.row]]; 
    } 

    return cell; 
} 

funziona per me. Naturalmente è necessario utilizzare la propria origine dati ecc.

+1

Ho già provato questo. Ma non funziona come voglio ... Se hai un codice di esempio per questo, ti preghiamo di fornire. E 'meglio per me .. Controlla il commento di @Meharoof Najeeb sotto domanda .. –

+0

@MeetDoshi Ho aggiunto un esempio di codice di annuncio che hai desiderato – owocki

+0

Grazie .. !! Suona bene. Onestamente è una grande logica. –

9

Non utilizzare MPMoviePlayerController, utilizzare AVFoundation 's AVPlayer.

Inoltre, non accoppiare il download della risorsa alla sottoclasse UITableViewCell. Utilizzare un'ulteriore fonte di dati per scaricare e gestire le risorse video.

Ci sono alcuni modi per farlo.

  1. Mantiene una matrice di origini dati di oggetti AVPlayerItem inizializzata dall'URL. Invece di caricare la risorsa ogni volta che scorri verso una cella, carica semplicemente AVPlayerItem nel lettore della cella e rimuovila quando scorri.

  2. Se è necessario mantenere i dati video, prendere in considerazione il download di ciascun video in un file temporaneo nella directory Documenti. Al termine del download, caricare i dati in AVAsset utilizzando il metodo initWithURL: e indirizzare l'URL al file locale. Quando sei pronto, puoi caricare il tuo asset in un AVPlayerItem utilizzando initWithAsset: e riprodurre il video.

+0

Voglio mettere in pausa il video, quando l'utente scorre verso il basso e riprodurlo di nuovo, può essere fatto al punto 1. –

+0

Puoi fornire un codice per scaricare il video . –

+0

C'è qualche framwork di terze parti con il quale posso riprodurre automaticamente il video nelle celle. –

2

Swift 3

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell")! 
    let videoURL = NSURL(string: "http://www.ebookfrenzy.com/ios_book/movie/movie.mov") 
    let player = AVPlayer(url: videoURL! as URL) 
    let playerLayer = AVPlayerLayer(player: player) 
    playerLayer.frame = cell.bounds 
    cell.layer.addSublayer(playerLayer) 
    player.play() 
    return cell 
} 
Problemi correlati