网络获取第一帧图片网上代码千篇一律,首先必须得异步,否则像tableView这种会很卡顿,用户体验极差。一开始用的是copyCGImageAtTime发现有部分视频返回为nil。后来看官方api发现有个异步方法generateCGImagesAsynchronouslyForTimes挺好用
FTool.h文件
typedef void(^MyImageBlock)(UIImage * _Nullable image);
+(void)getScreenshotWithUrlAsyn:(NSURL *)url completion:(MyImageBlock)handler;
FTool.m文件
+(void)getScreenshotWithUrlAsyn:(NSURL *)url completion:(MyImageBlock)handler{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform = YES;
CMTime time = CMTimeMakeWithSeconds(0, 60);
[generator generateCGImagesAsynchronouslyForTimes:@[[NSValue valueWithCMTime:time]] completionHandler:^(CMTime requestedTime, CGImageRef _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
UIImage *thumb = nil;
if (error) {
NSLog(@"获取视频第一帧错误 %@===%@",error,image);
}else{
thumb = [[UIImage alloc] initWithCGImage:image];
}
dispatch_async(dispatch_get_main_queue(), ^{
handler(thumb);
});
}];
});
}
使用
[FTool getScreenshotWithUrlAsyn:mediaUrl completion:^(UIImage * _Nullable image) {
//image就是截取的第一帧
}];