Ios AVVideoComposition应用筛选器处理程序未调用
我想在视频中添加叠加图像。我使用AVVideoComposition和CIFilter来执行此操作,但未调用AVAsynchronousCIImageFilteringRequest处理程序。 我设置了一些断点(debugPrint“Here”行,request.finish),但XCode没有命中断点。 我有视频,但没有水印Ios AVVideoComposition应用筛选器处理程序未调用,ios,swift,video,overlay,avvideocomposition,Ios,Swift,Video,Overlay,Avvideocomposition,我想在视频中添加叠加图像。我使用AVVideoComposition和CIFilter来执行此操作,但未调用AVAsynchronousCIImageFilteringRequest处理程序。 我设置了一些断点(debugPrint“Here”行,request.finish),但XCode没有命中断点。 我有视频,但没有水印 func watermark(video asset: AVAsset, with image: UIImage, output outURL: URL) {
func watermark(video asset: AVAsset, with image: UIImage, output outURL: URL) {
guard let watermarkImage = CIImage(image: image) else {
return
}
let context = CIContext(options: nil)
let videoComposition = AVVideoComposition(asset: asset) { (request) in
debugPrint("Here")
let source = request.sourceImage.clampedToExtent()
let watermarkFilter = CIFilter(name: "CISourceOverCompositing")
watermarkFilter?.setValue(source, forKey: kCIInputBackgroundImageKey)
let transform = CGAffineTransform(translationX: request.sourceImage.extent.width - watermarkImage.extent.width - 10, y: 10)
watermarkFilter?.setValue(watermarkImage.transformed(by: transform), forKey: kCIInputImageKey)
guard let outputImage = watermarkFilter?.outputImage else {
return
}
request.finish(with: outputImage, context: context)
}
let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetPassthrough)
exporter?.outputFileType = .mov
exporter?.outputURL = outURL
exporter?.videoComposition = videoComposition
exporter?.exportAsynchronously { [weak exporter] in
guard let export = exporter else {
return
}
switch export.status {
case .failed:
print("failed \(exporter?.error)")
break
case .cancelled:
print("cancelled \(exporter?.error)")
break
case .completed:
print("complete")
default:
print("default")
}
}
}
在一些帮助下,我发现,我使用了预设AVAssetExportPresetPassthrough,AVAssetExportSession忽略过滤器。我更改了预设,现在它可以工作了。您不应该在CI筛选中使用直通预设。尝试使用另一个定义视频格式的预设 没有特别提到CI过滤,但它指出使用passthrough预置将导致忽略层指令。我希望CI过滤也是如此 重要提示:如果使用AVAssetExportSession对象导出视频合成,并指定AVAssetExportPresetPassthrough导出预设以允许所有曲目通过,则不会应用视频合成指令(AvmutableVideoCompositionLayerStruction)中定义的变换。必须将导出预设更改为定义要应用的变换的视频格式(例如AVAssetExportPresetMediumQuality)的预设
没有人知道你在哪里设置了一个断点。什么不起作用?我的错。我编辑了第一篇文章。我得到了视频,但是没有水印。我不知道你是如何将你的图像与视频联系起来的。将CALayer对象添加到视频合成中。感谢您的帮助。我改变了预设,现在它工作了。嘿,陈,我已经发布了关于这个主题的问题。你能帮我和我的团队看看吗?我们被一个小问题困扰了好几天啊: