Search code examples
iosswiftvideogpuimage

GPUImageMovie: how to show the first frame of the video after playback is completed?


Here's how I'm setting the playback:

movie = GPUImageMovie(url: url)
movie.playAtActualSpeed = true
movie.delegate = self
movie.addTarget(self)
movie.startProcessing()

After the playback is completed, GPUImageView shows the last frame of the video file. How to change it to the first frame?


Solution

  • We can use AVPlayerItem and let AVPlayer to handle playback for us:

    func configure(url: URL) {
        // player is AVPlayer instance declated as property
        let playerItem = AVPlayerItem(url: url)
        player.replaceCurrentItem(with: playerItem)
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying(_:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem)
    
        movie = GPUImageMovie(playerItem: playerItem)
        movie.playAtActualSpeed = true
        movie.addTarget(self)
        movie.startProcessing()
    }
    
    func playerDidFinishPlaying(_ notification: Notification) {
        guard player.currentItem == notification.object as? AVPlayerItem else { return }
        player.seek(to: kCMTimeZero)
    }