Reproducir video desde la nueva URL sin crear un nuevo object AVPlayer.

Estoy tratando de permitir a los usuarios poder desplazarse por los videos, cambiando la URL de AVPlayer sobre la marcha sin actualizar la vista. Sin embargo, en este momento solo realizo los objects de AVPlayer cada vez que se reproduce un video (lo que hace que el audio se reproduzca entre sí), lo que creo que no es la mejor manera de hacerlo. ¿Hay una forma más eficiente de cambiar la image en un ImageView?

Este es el código donde reproduzco el clip:

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

No uses un AVPlayer .

En su lugar, use un AVQueuePlayer que le permite insert y eliminar elementos de una queue.

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

agregar elementos que simplemente puede usar

 //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 compatible con todas las funciones de AVPlayer pero tiene la funcionalidad adicional de agregar y eliminar elementos de una queue.

Use AVPlayerItem para agregar y eliminar salidas a un object AVPlayer.

En lugar de agregar un video al AVPlayer cuando lo creas, crea una instancia vacía de AVPlayer y luego usa el método addOutput de la class AVPlayerItem para agregar el video.

Para eliminar el video y agregar uno nuevo, use el método removeOutput de la class AVPlayerItem para eliminar el video anterior y luego el método addOutput nuevamente para insert el nuevo.

El código de ejemplo está disponible en el sitio de desarrolladores de Apple en;

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

Proporciona lo mismo que yo, si publicara un código propio.

Soy capaz de lograr lo que buscas haciendo esto …

Tengo una vista de tabla de nombres de canciones, para la cual los files mp3 se almacenan en Parse.com. En didSelectRowAtIndexPath , hago …

  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() } }) } 

cuando ejecuto esto, selecciono una fila y la canción comienza a reproducirse. Si entonces espero unos segundos y selecciono una fila diferente, el AVPlayer reproducirá la canción de la nueva celda que seleccioné y NO reproducirá una canción sobre la otra. Mi AVPlayer se declara como una variable pública para que todas las classs vean.