Take frames from a video using Swift

I want to capture frames from a video at a specific time. I call the grab-frame function with the time specified in seconds as Float64. The problem is that it does not capture the current frame. It seems to be ignoring decimals. If I call a function, for example, with 1.22 and 1.70, it will return the same frame. I am brand new when it comes to Swift, so I think that I will not get a CMTime object. So can anyone see what is wrong with this?

func generateThumnail(url : NSURL, fromTime:Float64) -> UIImage { var asset :AVAsset = AVAsset.assetWithURL(url) as! AVAsset var assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) assetImgGenerate.appliesPreferredTrackTransform = true var error : NSError? = nil var time : CMTime = CMTimeMakeWithSeconds(fromTime, 600) var img : CGImageRef = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil, error: &error) var frameImg : UIImage = UIImage(CGImage: img)! return frameImg } var grabTime = 1.22 img = generateThumnail(urlVideo, fromTime: Float64(grabTime)) 
+6
swift video avfoundation
Aug 29 '15 at 12:58
source share
3 answers

Thanks to @ eric-d who found this post: iOS Take some screenshots

I managed to find out that the addition:

  assetImgGenerate.requestedTimeToleranceAfter = kCMTimeZero; assetImgGenerate.requestedTimeToleranceBefore = kCMTimeZero; 

... my function will do the trick.

My updated function looks like this:

 func generateThumnail(url : NSURL, fromTime:Float64) -> UIImage { var asset :AVAsset = AVAsset.assetWithURL(url) as! AVAsset var assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) assetImgGenerate.appliesPreferredTrackTransform = true assetImgGenerate.requestedTimeToleranceAfter = kCMTimeZero; assetImgGenerate.requestedTimeToleranceBefore = kCMTimeZero; var error : NSError? = nil var time : CMTime = CMTimeMakeWithSeconds(fromTime, 600) var img : CGImageRef = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil, error: &error) var frameImg : UIImage = UIImage(CGImage: img)! return frameImg } var grabTime = 1.22 img = generateThumnail(urlVideo, fromTime: Float64(grabTime)) 
+12
Aug 30 '15 at 13:53 on
source share

I included the arpo answer in my project updated for Swift 3:

 fileprivate func generateThumnail(url : URL, fromTime:Float64) -> UIImage? { let asset :AVAsset = AVAsset(url: url) let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) assetImgGenerate.appliesPreferredTrackTransform = true assetImgGenerate.requestedTimeToleranceAfter = kCMTimeZero; assetImgGenerate.requestedTimeToleranceBefore = kCMTimeZero; let time : CMTime = CMTimeMakeWithSeconds(fromTime, 600) if let img = try? assetImgGenerate.copyCGImage(at:time, actualTime: nil) { return UIImage(cgImage: img!) } else { return nil } } 
+1
Oct 07 '16 at 10:11
source share

For quick 4.2

 fileprivate func generateThumnail(url : URL, fromTime:Float64) -> UIImage? { let asset :AVAsset = AVAsset(url: url) let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) assetImgGenerate.appliesPreferredTrackTransform = true assetImgGenerate.requestedTimeToleranceAfter = CMTime.zero; assetImgGenerate.requestedTimeToleranceBefore = CMTime.zero; let time : CMTime = CMTimeMakeWithSeconds(fromTime, preferredTimescale: 600) if let img = try? assetImgGenerate.copyCGImage(at:time, actualTime: nil) { return UIImage(cgImage: img) } else { return nil } } 
0
Dec 05 '18 at 14:28
source share



All Articles