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

标签 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 之类的东西。

谢谢

最佳答案

您应该配置 AVAssetImageGeneratorrequestedTimeToleranceBeforerequestedTimeToleranceAfter 属性。它们默认为 kCMTimePositiveInfinity,这意味着最近的关键帧。如果将它们都设置为 kCMTimeZero,您将获得您感兴趣的确切帧。

关于ios - 从视频中提取最后一个 UIImage 帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31805010/

相关文章:

ios - 检查用户在应用内购买中购买的产品

ios - 在ios中获取视频的FPS

ios - AVAssetExportSession 在输出视频的右侧和底部给我一个绿色边框

ios - XCode 中的钥匙串(keychain)警告

ios - senTestCase中的 "sen"是什么意思?

ios - 从 didFinishLaunchingWithOptions 终止应用程序

objective-c - 状态机 - 枚举是状态的选择吗?

ios - 如何使用 NSFetchedResultsController 建立 A-Z 索引

ios - 自动验证 Amazon Cognito 用户池中的用户

Swift 合并 .ts 或 mpeg 文件