ios - AVVideoComposition、CIFilter、CIImage 的 iOS 视频过滤器非常慢
问题描述
我想从照片中过滤选定的视频,所以使用 CIFilter 和 AVVideoComposition 但这需要太多时间。
30秒的视频需要3分钟。
如何减少过滤时间。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
[self dismissViewControllerAnimated:YES completion:nil];
NSURL *videoUrl = [info objectForKey:UIImagePickerControllerMediaURL];
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
AVAsset *asset = [AVAsset assetWithURL:videoUrl];
AVVideoComposition *composition = [AVVideoComposition videoCompositionWithAsset:asset applyingCIFiltersWithHandler:^(AVAsynchronousCIImageFilteringRequest * _Nonnull request) {
CIImage *ciImage = request.sourceImage.imageByClampingToExtent;
[filter setValue:ciImage forKey:kCIInputImageKey];
Float64 seconds = CMTimeGetSeconds(request.compositionTime);
[filter setValue: @(seconds * 10.0) forKey:kCIInputRadiusKey];
CIImage *outputImage = [filter.outputImage imageByCroppingToRect:request.sourceImage.extent];
[request finishWithImage:outputImage context:nil];
}];
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mp4"];
unlink([pathToMovie UTF8String]);
NSURL *outputUrl = [NSURL fileURLWithPath:pathToMovie];
AVAssetExportSession *export = [AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
export.outputFileType = AVFileTypeQuickTimeMovie;
export.outputURL = outputUrl;
export.videoComposition = composition;
[export exportAsynchronouslyWithCompletionHandler:^{
NSLog(@"Video Output url : %@", outputUrl.absoluteString);
}];
}
解决方案
推荐阅读
- python - 使用openpyxl将数据放在excel上
- api-platform.com - 如何让openapi平台路径参数出现在界面中
- javascript - 如何使用代理中断 Array.push?
- javascript - Google 表格将条件格式转换为 Apps 脚本
- python-3.x - 如何从纪元以来的单位时间轻松创建日期时间对象?
- visual-studio - 在 Visual Studio 中创建 Blazor 项目时“序列不包含元素”
- pine-script - TradingView 的 Pinescript - 为什么不允许递归?
- amazon-web-services - AWS Personalize — eventType 必须是关联数组
- elasticsearch - ElastAlert 将查询和范围组合成 OR 子句
- node.js - 如何注销并清除 Passport 和 Express-session 的会话?