从视频中提取最后一个 UIImage 帧
Extracting last UIImage frame from a video
我正在使用下一个代码从视频中提取最后一帧:
- (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 之类的东西。
谢谢
您应该配置 AVAssetImageGenerator
的 requestedTimeToleranceBefore
和 requestedTimeToleranceAfter
属性。它们默认为 kCMTimePositiveInfinity
,这意味着最近的关键帧。如果您将它们都设置为 kCMTimeZero
,您将获得您感兴趣的确切帧。
我正在使用下一个代码从视频中提取最后一帧:
- (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 之类的东西。
谢谢
您应该配置 AVAssetImageGenerator
的 requestedTimeToleranceBefore
和 requestedTimeToleranceAfter
属性。它们默认为 kCMTimePositiveInfinity
,这意味着最近的关键帧。如果您将它们都设置为 kCMTimeZero
,您将获得您感兴趣的确切帧。