見出し画像

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)
}

参考: https://stackoverflow.com/questions/40530367/swift-3-how-to-add-watermark-on-video-avvideocompositioncoreanimationtool-ios

しかしこの方法は`AVVideoComposition`のイニシャライザにAVAssetを渡してそのアセットに対してフィルタリングするものであり、こちらの記事に書いたような、

AVMutableVideoCompositionを併用して編集を行いたいケースでは使えない(と思う)。

ので、そういう場合には次の方法を利用する。

AVVideoCompositionCoreAnimationToolを利用する

`AVMutableVideoComposition`の `animationTool` プロパティに `AVVideoCompositionCoreAnimationTool` オブジェクトをセットする。

ここから先は

722字
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/