从视频中提取最后一个UIImage帧

时间:2015-08-04 09:04:23

标签: ios objective-c avasset

我正在使用下一个代码从视频中提取最后一帧:

- (UIImage *)thumbnailFromVideoAtURL:(NSURL *)url
{
    AVAsset *asset = [AVAsset assetWithURL:url];

    CMTime thumbnailTime = [asset duration];
    NSLog(@"value: %lld",thumbnailTime.value); //1650
    NSLog(@"timescale: %d",thumbnailTime.timescale); //1000
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];    
    CGImageRef imageRef = [imageGenerator copyCGImageAtTime:thumbnailTime actualTime:NULL error:NULL];
    UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);

    return thumbnail;
}

代码和CMTime看起来很好(这是一段1.65秒的视频),但我仍然回到视频的第一帧(它是一个mov文件)。 如果我在较长的视频上尝试上面的代码,我会从视频中间得到一个帧,或者一个接近结尾的帧,但从来不是最后一帧。

知道问题是什么?

  • 我试图避免使用像ffmpeg这样的东西。

由于

1 个答案:

答案 0 :(得分:5)

您应该配置requestedTimeToleranceBefore的{​​{1}}和requestedTimeToleranceAfter属性。它们默认为AVAssetImageGenerator,这意味着最接近的关键帧。如果将它们都设置为kCMTimePositiveInfinity,您将获得您感兴趣的确切帧。