我正在尝试为我的视频添加全屏水印。
不幸的是,水印图像(红色矩形)被 CIFilter 调整了大小,我找不到让它全屏显示的方法。
有没有办法设置 CIImage 的大小?
let watermarkFilter = CIFilter(name: "CISourceOverCompositing")!
let watermarkImage = CIImage(image: image)
let videoComposition = AVVideoComposition(asset: asset) { (filteringRequest) in
let source = filteringRequest.sourceImage.clampedToExtent()
watermarkFilter.setValue(source, forKey: "inputBackgroundImage")
watermarkFilter.setValue(watermarkImage, forKey: "inputImage")
let output = watermarkFilter.outputImage!
filteringRequest.finish(with: output, context: nil)
}
我也尝试过将 CIImage 放大,但这也不起作用。
func addImageToVideo(inputURL: URL, image: UIImage, handler: @escaping (_ exportSession: AVAssetExportSession?)-> Void) {
let mixComposition = AVMutableComposition()
let asset = AVAsset(url: inputURL)
let videoTrack = asset.tracks(withMediaType: AVMediaType.video)[0]
let timerange = CMTimeRangeMake(kCMTimeZero, asset.duration)
let compositionVideoTrack:AVMutableCompositionTrack = mixComposition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid))!
do {
try compositionVideoTrack.insertTimeRange(timerange, of: videoTrack, at: kCMTimeZero)
compositionVideoTrack.preferredTransform = videoTrack.preferredTransform
} catch {
print(error)
}
let watermarkFilter = CIFilter(name: "CISourceOverCompositing")!
let watermarkImage = CIImage(image: image)
//Filer method
let videoComposition = AVVideoComposition(asset: asset) { (filteringRequest) in
let sourceImage = filteringRequest.sourceImage.clampedToExtent()
var transform = CGAffineTransform.identity
let scaleX = image.size.width / image.scale
let scaleY = image.size.height / image.scale
transform = transform.scaledBy(x: scaleX, y: scaleY)
let transformFilter = CIFilter(name: "CIAffineClamp")!
transformFilter.setValue( watermarkImage, forKey: "inputImage" )
transformFilter.setValue( transform, forKey: "inputTransform")
watermarkFilter.setValue(sourceImage, forKey: "inputBackgroundImage")
watermarkFilter.setValue(transformFilter.outputImage, forKey: "inputImage")
let output = watermarkFilter.outputImage!
filteringRequest.finish(with: output, context: nil)
}
guard let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality) else {
handler(nil)
return
}
exportSession.outputURL = outputURL
exportSession.outputFileType = AVFileType.mp4
exportSession.shouldOptimizeForNetworkUse = true
exportSession.videoComposition = videoComposition
exportSession.exportAsynchronously { () -> Void in
handler(exportSession)
}
}
我真的不知道该怎么办,我已经花了几周时间试图简单地将水印渲染到视频中,但不幸的是,这只是不想工作。