我正在尝试从Swift中的视频中提取帧作为UIMages。我找到了几个Objective C解决方案,但在Swift中找不到任何解决方案。假设以下内容正确,有人可以帮助我将以下内容转换为Swift或给我他们自己的方法吗?
来源:Grabbing the first frame of a video from UIImagePickerController?
- (UIImage *)imageFromVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time {
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
NSParameterAssert(asset);
AVAssetImageGenerator *assetIG =
[[AVAssetImageGenerator alloc] initWithAsset:asset];
assetIG.appliesPreferredTrackTransform = YES;
assetIG.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
CGImageRef thumbnailImageRef = NULL;
CFTimeInterval thumbnailImageTime = time;
NSError *igError = nil;
thumbnailImageRef =
[assetIG copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60)
actualTime:NULL
error:&igError];
if (!thumbnailImageRef)
NSLog(@"thumbnailImageGenerationError %@", igError );
UIImage *image = thumbnailImageRef
? [[UIImage alloc] initWithCGImage:thumbnailImageRef]
: nil;
return image;
}
4条答案
按热度按时间xdnvmnnf1#
它确实起作用了。
但是请记住,这个函数是同步的,最好不要在主队列中调用它。
您可以执行以下任一操作:
或者使用
generateCGImagesAsynchronously
代替copyCGImage
。c7rzv4ha2#
以下是Dmitry解决方案的SWIFT 5替代方案,您不必担心自己处于哪个队列:
现在来使用它:
wnvonmuf3#
你可以在iOS上轻松做到这一点。下面是一段代码片段,说明如何在Swift上做到这一点。
您可以找到演示代码here和中等文章here。
lbsnaicq4#
下面是@Dmitry的async/await版本,可以帮助那些不喜欢完成处理程序的人
用法:
如果你使用抛出函数,就像这样: