Video on Pages of Page View Controller going Black

I embed a video on every page of my pageview controller. I am using the page view template template application with Xcode since I am noob. The first few videos work and play the content, but after several attempts, all the videos turn black.

I use this Swift video game library: https://github.com/piemonte/Player

Any help would be appreciated!

Model controller code, the same values ​​that are deliberately repeated for example ...

class ModelController: NSObject, UIPageViewControllerDataSource {

    var pageTitleData: [String] = [
        "Banana",
        "Banana",
        "Banana",
        "Banana",
        "Banana",
        "Banana",
        "Banana",
        "Banana",
        "Banana",
        "Banana"
    ]

    var videoURLData: [String] = [
        NSBundle.mainBundle().pathForResource("banana", ofType:"mp4")!,
        NSBundle.mainBundle().pathForResource("banana", ofType:"mp4")!,
        NSBundle.mainBundle().pathForResource("banana", ofType:"mp4")!,
        NSBundle.mainBundle().pathForResource("banana", ofType:"mp4")!,
        NSBundle.mainBundle().pathForResource("banana", ofType:"mp4")!,
        NSBundle.mainBundle().pathForResource("banana", ofType:"mp4")!,
        NSBundle.mainBundle().pathForResource("banana", ofType:"mp4")!,
        NSBundle.mainBundle().pathForResource("banana", ofType:"mp4")!,
        NSBundle.mainBundle().pathForResource("banana", ofType:"mp4")!,
        NSBundle.mainBundle().pathForResource("banana", ofType:"mp4")!
    ]

    override init() {
        super.init()
    }


    //
    func viewControllerAtIndex(index: Int, storyboard: UIStoryboard) -> DataViewController? {
        // Return the data view controller for the given index.
        if (self.pageTitleData.count == 0) || (index >= self.pageTitleData.count) {
            return nil
        }

        // Create a new view controller and pass suitable data.
        let dataViewController = storyboard.instantiateViewControllerWithIdentifier("DataViewController") as! DataViewController
        dataViewController.pageTitleDataObject = self.pageTitleData[index]
        dataViewController.videoURLDataObject = self.videoURLData[index]
        return dataViewController
    }


    //
    func indexOfViewController(viewController: DataViewController) -> Int {
        // Return the index of the given data view controller.
        // For simplicity, this implementation uses a static array of model objects and the view controller stores the model object; you can therefore use the model object to identify the index.
        return pageTitleData.indexOf(viewController.pageTitleDataObject) ?? NSNotFound
    }


    // MARK: - Page View Controller Data Source
    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        var index = self.indexOfViewController(viewController as! DataViewController)
        if (index == 0) || (index == NSNotFound) {
            return nil
        }

        index--
        return self.viewControllerAtIndex(index, storyboard: viewController.storyboard!)
    }


    //
    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        var index = self.indexOfViewController(viewController as! DataViewController)
        if index == NSNotFound {
            return nil
        }

        index++
        if index == self.pageTitleData.count {
            return nil
        }
        return self.viewControllerAtIndex(index, storyboard: viewController.storyboard!)
    }

}

DataViewController Code ...

class DataViewController: UIViewController, PlayerDelegate {


    @IBOutlet weak var veggieLabel: UILabel!
    @IBOutlet weak var videoWrapper: UIView!

    private var player: Player!


    // video voodoo
    convenience init() {
        self.init(nibName: nil, bundle:nil)
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }



    var pageTitleDataObject: String = ""
    var videoURLDataObject: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.autoresizingMask = ([UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight])

        // tether player
        self.player = Player()
        // listen
        self.player.delegate = self
        // set size of player
        self.player.view.frame = self.view.bounds
        // add player
        self.addChildViewController(self.player)
        // add to videowrapper
        self.videoWrapper.addSubview(self.player.view)
        self.player.didMoveToParentViewController(self)




        let fileUrl = NSURL.fileURLWithPath(videoURLDataObject)
        self.player.setUrl(fileUrl)



        // set video fill mode
        self.player.fillMode = "AVLayerVideoGravityResizeAspectFill"

        // set video playback to loop
        self.player.playbackLoops = true

        // add tap gesture to video player
        let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTapGestureRecognizer:")
        tapGestureRecognizer.numberOfTapsRequired = 1
        self.player.view.addGestureRecognizer(tapGestureRecognizer)
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.veggieLabel!.text = pageTitleDataObject
        self.player.playFromBeginning()
    }






    // tap Gesture Handling
    func handleTapGestureRecognizer(gestureRecognizer: UITapGestureRecognizer) {
        switch (self.player.playbackState.rawValue) {
        case PlaybackState.Stopped.rawValue:
            self.player.playFromBeginning()
        case PlaybackState.Paused.rawValue:
            self.player.playFromCurrentTime()
        case PlaybackState.Playing.rawValue:
            self.player.pause()
        case PlaybackState.Failed.rawValue:
            self.player.pause()
        default:
            self.player.pause()
        }
    }


    // player delegates
    func playerReady(player: Player) { }
    func playerPlaybackStateDidChange(player: Player) { }
    func playerBufferingStateDidChange(player: Player) { }
    func playerPlaybackWillStartFromBeginning(player: Player) { }
    func playerPlaybackDidEnd(player: Player) { }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}
+4
source share

Source: https://habr.com/ru/post/1620250/


All Articles