如何从video获取最后一帧?

我想要最后一帧video,我的代码如下所示:

let asset : AVURLAsset = AVURLAsset(URL: videoURL, options: nil) let generate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) generate.appliesPreferredTrackTransform = true var err : NSError? = nil var lastFrameTime = Int64(CMTimeGetSeconds(asset.duration)) let time : CMTime = CMTimeMake(lastFrameTime, 30) let imgRef : CGImageRef = generate.copyCGImageAtTime(time, actualTime: nil, error: &err) let img : UIImage = UIImage(CGImage: imgRef)! 

但我没有得到最后一帧,我正在获得第一帧,为此提供解决scheme。

我用Pooja的代码作为起点,但没有得到最后一帧。 它接近最后一帧。 这是我得到实际的最后一帧的解决scheme。 如果帧精度很重要,那么你必须使用:

 imageGenerator.requestedTimeToleranceBefore = kCMTimeZero imageGenerator.requestedTimeToleranceAfter = kCMTimeZero 

请注意,生成此帧准确的最后一帧可能需要更长的时间,因此您可能需要在后台线程上执行此操作。

这是我正在使用的代码:

 let imageGenerator = AVAssetImageGenerator(asset: asset!) imageGenerator.appliesPreferredTrackTransform = true imageGenerator.requestedTimeToleranceAfter = kCMTimeZero imageGenerator.requestedTimeToleranceBefore = kCMTimeZero let composition = AVVideoComposition(propertiesOfAsset: asset!) let time = CMTimeMakeWithSeconds(asset!.duration.seconds, composition.frameDuration.timescale) do { let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil) } catch let error as NSError { print("Image generation failed with error \(error)") } 

希望这可以帮助。

我已经解决了这个问题,只得到video的最后一帧代码如下:

  let asset : AVURLAsset = AVURLAsset(URL: videoURL, options: nil) let generate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) generate.appliesPreferredTrackTransform = true var err : NSError? = nil var lastFrameTime = Int64(CMTimeGetSeconds(asset.duration)*60.0) let time : CMTime = CMTimeMake(lastFrameTime, 2) let imgRef : CGImageRef = generate.copyCGImageAtTime(time, actualTime: nil, error: &err) let img : UIImage = UIImage(CGImage: imgRef)! 

这是我如何获得imgvariables中的最后一个video图像。

您可以在Objective-C中获得最后一帧video,如下所述: –

  AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoURL options:nil]; AVAssetImageGenerator *generate = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset]; generate.appliesPreferredTrackTransform = YES; NSError *error; int64_t lastFrameTime = CMTimeGetSeconds(asset.duration)*60.0; CMTime time = CMTimeMake(lastFrameTime, 2); CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:nil error:&error]; UIImage *image = [UIImage imageWithCGImage:imgRef];