I want to add an overlay image into a video. I use AVVideoComposition and CIFilter to do this, but AVAsynchronousCIImageFilteringRequest handler not called.
I put some breakpoints (line debugPrint"Here", request.finish), but XCode doesn't hit the breakpoints.
我收到了视频,但是没有水印。
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")
}
}
}
您不应将直通预设与 CI 过滤一起使用。尝试使用另一个定义视频格式的预设。
这个文档 https://developer.apple.com/library/archive/qa/qa1744/_index.html没有具体提到 CI 过滤,但它指出使用直通预设会导致层指令被忽略。我希望 CI 过滤也是一样的。
重要提示:如果您使用 AVAssetExportSession 对象导出视频合成并指定 AVAssetExportPresetPassthrough 导出预设以让所有轨道通过,则将不会应用视频合成指令 (AVMutableVideoCompositionLayerInstruction) 中定义的变换。您必须将导出预设更改为定义视频格式的导出预设(例如 AVAssetExportPresetMediumQuality)才能应用转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)