Using Swift with AVPlayer, how do you add and remove a video via code?

13,990

Using the dispatch fixed the issue I was having.

dispatch_async(dispatch_get_main_queue()) {
    self.player!.pause()
    self.playerLayer!.removeFromSuperlayer()
 }
Share:
13,990
B.Man
Author by

B.Man

Updated on June 04, 2022

Comments

  • B.Man
    B.Man almost 2 years

    I'm new to Swift and am trying to add a video to the view and then remove it when my "stopScreenSaver" notification is dispatched. All seems to work well except for when I go to remove the video layer (playerLayer.removeFromSuperlayer()).

    Any guidance would be appreciated. I feel like I'm missing some basic concept here for adding and removing the layer!

        import UIKit
        import AVFoundation
        import QuartzCore
        import CoreMedia
    
        class ViewController: UIViewController {
    
            let contentURL = NSBundle.mainBundle().URLForResource("testvideo", withExtension: "mp4")
            var player = AVPlayer()
            var playerLayer = AVPlayerLayer()
            let screenSize : CGRect = UIScreen.mainScreen().bounds
    
            override func viewDidLoad() {
                super.viewDidLoad()
                // Used for starting and stopping the videos related to the screen saver
                NSNotificationCenter.defaultCenter().addObserver(self, selector: "playScreenSaver:", name: "playScreenSaverID", object: nil)
                NSNotificationCenter.defaultCenter().addObserver(self, selector: "stopScreenSaver:", name: "stopScreenSaverID", object: nil)
    }
    
            override func viewDidAppear(animated: Bool) {
                // Player
                player = AVPlayer(URL: contentURL!)
    
                // Layer for display… Video plays at the full size of the iPad
                playerLayer = AVPlayerLayer(player: player)
                var view = UIView(frame: CGRectMake(0, 0, screenSize.width, screenSize.height))
                self.view.layer.addSublayer(playerLayer)
                playerLayer.frame = view.bounds
            }
    
            override func didReceiveMemoryWarning() {
                super.didReceiveMemoryWarning()
            }
    
    
        func playScreenSaver(notification: NSNotification){
                print("play")
                dispatch_async(dispatch_get_main_queue()) {
                   self.view.layer.addSublayer(self.playerLayer!)
                   self.player!.play()
                }
        }
    
        func stopScreenSaver(notification: NSNotification){
                print("pause")
                dispatch_async(dispatch_get_main_queue()) {
                   self.player!.pause()
                   self.playerLayer!.removeFromSuperlayer()
                }
        }
    
    }