Got some nil CGImages using AVAssetImageGenerator

242 views Asked by At

I want to extract frames as UIImage from a video. That's why I used AVAssetImageGenerator.
First I saved times

var frameCount = 0;
var maximumFrame = 300;
let duration = asset.duration
let vid_length : CMTime = duration
let timeScale = vid_length.timescale
let seconds : Double = CMTimeGetSeconds(vid_length)
var times = [CMTime]()
var timeForGetImage : Double = 0
let step : Double =  0.033
while(frameCount < maximumFrame && timeForGetImage <= seconds) {
    let time : CMTime = CMTimeMakeWithSeconds(timeForGetImage, preferredTimescale: timeScale)
    times.append(time)
    timeForGetImage+=step
    frameCount += 1
}

for getting frames as Images I used this method

let imageGenerator : AVAssetImageGenerator = AVAssetImageGenerator.init(asset: asset)
imageGenerator.requestedTimeToleranceAfter = CMTime.zero
imageGenerator.requestedTimeToleranceBefore = CMTime.zero
imageGenerator.appliesPreferredTrackTransform = true
imageGenerator.maximumSize = CGSize(width: height, height: height)

imageGenerator.generateCGImagesAsynchronously(forTimes: times as [NSValue]) { (requestedTime, cgImage, actualTime, result, error) in
       if result == .succeeded {
            let thumb : UIImage = UIImage.init(cgImage: cgImage!)
            /// doing some operation
       } else { 
           print("nil") /// I've found some images are nil
       }
}

Here I got some nil cgImages. I don't know why they are nil. But I need to get all frames as cgImages by using time period.
How to solve?
I know there is another approach using imageGenerator.copyCGImage method. But it takes too much time to produce all frames as UIImage```

0

There are 0 answers