如何从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];