我想在视频中添加一个覆盖图像。我使用AVVideoComposition和CIFilter来完成这个任务,但是AVAsynchronousCIImageFilteringRequest处理程序没有调用。我放置了一些断点(debugPrint“这里”,request.finish行),但是XCode没有命中断点。

我拿到了视频,但没有水印。
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")
}
}
}发布于 2018-06-26 07:05:41
您不应该使用传递预置与CI过滤。尝试使用另一个预置来定义视频格式。
这个医生没有特别提到CI过滤,但是它指出使用通通预置会导致层指令被忽略。我认为CI过滤也是一样的。
注意:如果您使用AVAssetExportSession对象导出视频组合,并指定AVAssetExportPresetPassthrough导出预置以让所有音轨通过,则不会应用在视频组合指令(AVMutableVideoCompositionLayerInstruction)中定义的转换。必须将导出预设更改为定义要应用的转换的视频格式(例如AVAssetExportPresetMediumQuality)。
发布于 2018-06-26 07:02:43
在一些帮助下,我发现我使用了预设的AVAssetExportPresetPassthrough,AVAssetExportSession忽略了过滤器。我改变了预设,现在起作用了。
https://stackoverflow.com/questions/51036125
复制相似问题