5

I am using AVQueuePlayer to play all the selected videos in loop or change the videos on swipe gesture.

But when i implemented the flow, there was black frame when user swipe changes the video from one to another.So to overcome that issue i used UIImageView.

What i did was when the user swipes for next video, i process the video for that current time and take image of same and initialise to imageview till the next video is available in queue. Below is the code that is used to achieve this solution

var player : AVQueuePlayer?
var playerItem: [AVPlayerItem] = []

    let tempCurrentIndex = currentIndex
    let tempPlayerItems = self.playerItem

    guard let currentAssest = self.player?.currentItem?.asset else {return}

    let playerCurrentTime = CMTimeGetSeconds(player!.currentTime())
    let newTime = playerCurrentTime + 0.0
    self.player?.pause()

    self.imgvwFlick.image = UIImage()

    self.imgvwFlick.image = self.getFrame(asset: currentAssest, time: newTime)

    self.player?.removeAllItems()
    for i in tempCurrentIndex + 1..<tempPlayerItems.count {
        tempPlayerItems[i].seek(to: .zero, toleranceBefore: .zero, toleranceAfter: .zero, completionHandler: nil)
        self.player?.insert(tempPlayerItems[i], after: nil)
    }

    self.player?.seek(to: .zero, toleranceBefore: .zero, toleranceAfter: .zero)
    self.currentIndex = tempCurrentIndex + 1
    self.player?.seek(to: .zero, toleranceBefore: .zero, toleranceAfter: .zero)
    self.player?.play()


func getFrame(asset:AVAsset,time:Double) -> UIImage{

    let generate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
    generate.appliesPreferredTrackTransform = true
    generate.requestedTimeToleranceAfter = .zero
    generate.requestedTimeToleranceBefore = .zero


    let cmTime = CMTime(seconds: time, preferredTimescale: asset.duration.timescale)
    let imgRef : CGImage = try! generate.copyCGImage(at: cmTime, actualTime: nil)
    let img : UIImage = UIImage(cgImage: imgRef)
    return img

  }

Using this it works good till iOS 12, but in iOS 13 i found a small white flicker type frame when i switch the video, below i am attaching the video of issue for both iOS

iOS 12 :- https://i.stack.imgur.com/oHHFa.jpg

iOS 13 :- https://i.stack.imgur.com/09Qvd.jpg

How can i solve the issue in iOS 13?

matt
  • 515,959
  • 87
  • 875
  • 1,141
Zღk
  • 854
  • 7
  • 25

0 Answers0