Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Play video from new URL without creating a new AVPlayer object

Tags:

ios

swift

I'm trying to allow users to be able to cycle through videos, changing the AVPlayer URL on the fly without refreshing the view. However, right now I'm just instantiating AVPlayer objects every time a video is played (resulting in audio to be played over one another), which I feel isn't the best way to do this. Is there a more efficient way similar to changing the image in an imageView?

This is the code where I play the clip:

player = AVPlayer(URL: fileURL)
playerLayer = AVPlayerLayer(player: player)
playerLayer!.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer!)
player!.play()
like image 431
cb428 Avatar asked Jan 26 '16 00:01

cb428


2 Answers

Do not use an AVPlayer.

Instead use an AVQueuePlayer which allows you to insert and remove items from a queue.

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

to add items you can simply use

//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 supports all of the functionality of the AVPlayer but has the added functionality of adding and removing items from a queue.

like image 121
Matthew Cawley Avatar answered Nov 15 '22 15:11

Matthew Cawley


Use AVPlayerItem to add and remove outputs to an AVPlayer object.

Instead of adding a video to the AVPlayer when you create it, create an empty AVPlayer instance, and then use the addOutput method of the AVPlayerItem class to add the video.

To remove the video and add a new one, use the removeOutput method of the AVPlayerItem class to remove the old video, and then the addOutput method again to insert the new one.

Sample code is available from Apple's developer site at;

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

It provides the same thing I would, were I to post code of my own.

like image 32
James Bush Avatar answered Nov 15 '22 14:11

James Bush