iOSで動画にウォーターマークを付加する
まだ告知してませんが、ひっそりと機械学習を用いた動画編集アプリをつくってちょこちょこアップデートしています。
で、動画にウォーターマークを入れる、つまり動画に画像を合成して書き出すにはどう実装するか、という話。
2通りある。
CIFilterと AVVideoComposition を利用する方法
AVVideoCompositionに次のようなイニシャライザがある。
init(asset: AVAsset, applyingCIFiltersWithHandler applier: @escaping (AVAsynchronousCIImageFilteringRequest) -> Void)
これを用いて、以下のようにフィルタ処理を行うクロージャを渡すことができる。
let videoComposition = AVVideoComposition(asset: asset) { (filteringRequest) in
// Core Image / CIFilterを用いたフィルタ処理
...
filteringRequest.finish(with: filter.outputImage!, context: nil)
}
CISourceOverCompositingという画像をオーバーレイするCIFilterがあるので、これを使ってウォーターマークを動画に付与できる。
let watermarkFilter = CIFilter(name: "CISourceOverCompositing")!
let videoComposition = AVVideoComposition(asset: asset) { (filteringRequest) in
let source = filteringRequest.sourceImage.clampedToExtent()
watermarkFilter.setValue(source, forKey: "inputBackgroundImage")
let transform = CGAffineTransform(translationX: filteringRequest.sourceImage.extent.width - (watermarkImage?.extent.width)! - 2, y: 0)
watermarkFilter.setValue(watermarkImage?.transformed(by: transform), forKey: "inputImage")
filteringRequest.finish(with: watermarkFilter.outputImage!, context: nil)
}
しかしこの方法は`AVVideoComposition`のイニシャライザにAVAssetを渡してそのアセットに対してフィルタリングするものであり、こちらの記事に書いたような、
AVMutableVideoCompositionを併用して編集を行いたいケースでは使えない(と思う)。
ので、そういう場合には次の方法を利用する。
AVVideoCompositionCoreAnimationToolを利用する
`AVMutableVideoComposition`の `animationTool` プロパティに `AVVideoCompositionCoreAnimationTool` オブジェクトをセットする。
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/