2016-01-26 11 views
7

Sto tentando di consentire agli utenti di poter scorrere i video, modificando l'URL di AVPlayer in tempo reale senza aggiornare la visualizzazione. Tuttavia, al momento sto solo istanziando oggetti AVPlayer ogni volta che viene riprodotto un video (con conseguente riproduzione audio tra di loro), che ritengo non sia il modo migliore per farlo. C'è un modo più efficiente simile a cambiare l'immagine in un imageView?Riprodurre video dal nuovo URL senza creare un nuovo oggetto AVPlayer

Questo è il codice dove gioco la clip:

player = AVPlayer(URL: fileURL) 
playerLayer = AVPlayerLayer(player: player) 
playerLayer!.frame = self.view.bounds 
self.view.layer.addSublayer(playerLayer!) 
player!.play() 

risposta

0

Sono in grado di compiere ciò che si sta cercando in questo modo ...

Ho un tableView di nomi di canzone, per che i file mp3 sono memorizzati su Parse.com. In didSelectRowAtIndexPath faccio ...

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    SelectedSongNumber = indexPath.row 
    grabSong() 
} 


    func grabSong() { 

    let songQuery = PFQuery(className: "Songs") 
    songQuery.getObjectInBackgroundWithId(iDArray[SelectedSongNumber], block: { 
     (object: PFObject?, error : NSError?) -> Void in 


     if let audioFile = object?["SongFile"] as? PFFile { 
      let audioFileUrlString: String = audioFile.url! 
      let audioFileUrl = NSURL(string: audioFileUrlString)! 

      myAVPlayer = AVPlayer(URL: audioFileUrl) 
      myAVPlayer.play() 

      currentUser?.setObject(audioFileUrlString, forKey: "CurrentSongURL") 
      currentUser?.saveInBackground() 
     } 
    }) 
} 

quando ho eseguito questo, seleziono una riga e la canzone inizia a suonare. Se poi aspetto qualche secondo e selezioni una riga diversa, l'AVPlayer riproduce la canzone dalla nuova cella che ho selezionato e NON suona una canzone rispetto all'altra. Il mio AVPlayer è dichiarato come variabile pubblica da vedere per tutte le classi.

+0

Come ho già detto, non accedere all'oggetto AVPlayer dopo la creazione; piuttosto, funziona solo con il suo currentItem. –

+0

@JamesBush In effetti il ​​tuo è un metodo migliore. Un'altra opzione consiste nell'utilizzare un AVQueuePlayer, aggiungere tutti gli URL possibili di un array AVPlayerItems, quindi inserire tale array nella coda e riordinare l'array al volo. Ciò consentirà al prossimo video in linea di iniziare il buffering mentre il video precedente è ancora in riproduzione – MikeG

+0

Oppure: [self.player prerollAtRate: 1.0 completionHandler:^(BOOL terminato) { [riproduzione self.player]; [self.player setRate: 1.0]; }]; –

3

Utilizzare AVPlayerItem per aggiungere e rimuovere output a un oggetto AVPlayer.

Invece di aggiungere un video a AVPlayer quando lo si crea, creare un'istanza AVPlayer vuota e quindi utilizzare il metodo addOutput della classe AVPlayerItem per aggiungere il video.

Per rimuovere il video e aggiungerne uno nuovo, utilizzare il metodo removeOutput della classe AVPlayerItem per rimuovere il vecchio video e quindi nuovamente il metodo addOutput per inserirne uno nuovo.

Il codice di esempio è disponibile dal sito degli sviluppatori di Apple all'indirizzo;

https://developer.apple.com/library/prerelease/content/samplecode/AVBasicVideoOutput/Introduction/Intro.html

Esso fornisce la stessa cosa che sarebbe, se io inserisco il codice del mio.

+0

grazie, dovrei usare anche AVAsset? – cb428

+0

Chiedo perché non riesco a creare un'istanza di AVPlayerItem senza un URL o un set di AVA. Non sarei in grado di accedere alla variabile fileURL in viewDidLoad dove configurerei AVPlayer. – cb428

+0

@James Bush puoi mostrare qualche codice? – George

12

Non utilizzare AVPlayer.

Utilizzare invece un AVQueuePlayer che consente di inserire e rimuovere elementi da una coda.

//create local player in setup methods 
self.localPlayer = AVQueuePlayer.init() 

per aggiungere elementi si può semplicemente utilizzare

//optional: clear current queue if playing straight away 
self.localPlayer.removeAllItems() 

//get url of track 
let url : URL? = URL.init(string: "http://urlOfItem") 
if url != nil { 
    let playerItem = AVPlayerItem.init(url: url!) 

    //you can use the after property to insert 
    //it at a specific location or leave it nil 
    self.localPlayer.insert(playerItem, after: nil) 
    self.localPlayer.play() 
} 

AVQueuePlayer supporta tutte le funzionalità del AVPlayer ma ha la funzionalità aggiunta di aggiungere e rimuovere elementi da una coda.

+0

Hai salvato il mio giorno. grazie mille. –

Problemi correlati