3

I am using AVPlayer to play local video in background using loop and video is playing fine but after finishing video it takes pause to play video in loop. I have tried many methods and also seen many post on stack overflow but i failed to find appropriate solution. I am using Swift3.

Code is here :

var videoplayer :AVPlayer = AVPlayer()

override func viewDidLoad() {
super.viewDidLoad()

let path = Bundle.main.path(forResource: "background4", ofType: "mp4")
        videoplayer = AVPlayer(url: URL(fileURLWithPath: path!))
        videoplayer.volume = 0     
        videoplayer.actionAtItemEnd = AVPlayerActionAtItemEnd.none;

        let playerLayer = AVPlayerLayer(player: videoplayer)
        playerLayer.frame = self.view.frame
        playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill

        if (videoplayer.rate != 0) {
            print("playing videoplayer")
            self.blurBgImage.isHidden = true
        }

        playerLayer.zPosition = -1
        videoplayer.rate = 0
        videoplayer.play()
        self.blurBgImage.layer.addSublayer(playerLayer)

 NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: videoplayer.currentItem, queue: nil, using: { (_) in
        DispatchQueue.main.async {

             let t1 = CMTimeMake(5, 100)
            self.videoplayer.seek(to: t1)
            self.videoplayer.play()
        }
    })
}

I have also tried AVPlayerLooper. Code is :

 var playerLooper: NSObject?
var playerLayer:AVPlayerLayer!
var queuePlayer: AVQueuePlayer?

 func playVideo(_ filmName: String){
       if let path = Bundle.main.path(forResource: filmName, ofType: "mp4")        let url =  URL(fileURLWithPath: path)
         if #available(tvOS 10.0, *) {
          let playerItem = AVPlayerItem(url: url as URL)
            self.videoplayer = AVQueuePlayer(items: [playerItem])
            self.playerLayer = AVPlayerLayer(player: self.videoplayer)
            self.playerLooper = AVPlayerLooper(player: self.videoplayer as! AVQueuePlayer, templateItem: playerItem)
            self.blurBgImage.layer.addSublayer(playerLayer!)
            self.playerLayer?.frame = self.view.frame
            self.videoplayer.volume = 10
            self.videoplayer.play()
        } else {
            videoplayer = AVPlayer(url: url)
            videoplayer.play()
            loopVideo(videoplayer)
        }
}
}

What should i do for seamless looping? Thanks in Advance.

Chetan Lodhi
  • 353
  • 1
  • 3
  • 21

1 Answers1

4

FYI there is sample code here: https://developer.apple.com/library/content/samplecode/avloopplayer/Introduction/Intro.html


@matt's deleted answer works fine for me (on device / simulator) for iOS 10+ devices:

Use AVPlayerLooper. That is exactly what it is for.

https://developer.apple.com/reference/avfoundation/avplayerlooper

Basically it implements AVQueuePlayer for you, constantly updating the queue so that it never ends.

It seamlessly loops without any white/black blip.

E.g.

private var looper: AVPlayerLooper?

...

let queuePlayer = AVQueuePlayer(playerItem: item)
looper = AVPlayerLooper(player: queuePlayer, templateItem: item)
videoPlayerLayer.player = queuePlayer

If you end up doing this in a reusable cell (e.g. UICollectionView), then make sure you disable looping before cell re-use or you'll get some obscure crashes:

looper?.disableLooping()
iwasrobbed
  • 46,496
  • 21
  • 150
  • 195