酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

iOS 13.4シミュレータで AVVideoCompositionCoreAnimationTool を使うとアプリがクラッシュする

現在、iOSアプリ内での動画編集機能を実装しています。

過去に 動画にウォーターマークをつける方法については調査済みでしたので、簡単に対応できると考えていましたが、謎のアプリクラッシュ現象が発生してしまいお手上げになってしまいました。

f:id:ch3cooh393:20200519112900p:plain
左:ウォーターマークをつけた動画、右:オリジナル動画

少しずつコードを削ってアプリがクラッシュしないところまで調べたところ、iOS 13.xシミュレータで AVVideoCompositionCoreAnimationTool を使っているとアプリがクラッシュしてしまうことが発覚しました。

シミュレータで AVVideoCompositionCoreAnimationTool を使うとクラッシュする

AVFoundationを使って動画に字幕やウォーターマークをつける時は、下記のように AVVideoCompositionCoreAnimationTool を使って合成します。

let parentLayer = CALayer()
let videoLayer = CALayer()
parentLayer.frame = CGRect(x: 0, y: 0, width: videoSize.width, height: videoSize.height)
videoLayer.frame = CGRect(x: 0, y: 0, width: videoSize.width, height: videoSize.height)
parentLayer.addSublayer(videoLayer)

// 画像を追加する
let imageLayer = CALayer()
imageLayer.contents = watermarkImage.cgImage
imageLayer.frame = CGRect(x: 0, y: 0, width: videoSize.width, height: videoSize.height)
imageLayer.opacity = 0.65
parentLayer.addSublayer(imageLayer)

videoComposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, in: parentLayer)

実機では正しく動作するため、当該機能の開発をする時のみ iOS 12.4シミュレータなどの古いOSバージョンで開発して、キリの良いところで実機でテストするのが効率的かもしれません。

  • iOS 13.4.1 シミュレータ:アプリがクラッシュする
  • iOS 13.1 シミュレータ:動画の後半が真っ暗になってしまう
  • iOS 12.4 シミュレータ:正常にウォーターマークと合成できる

参考記事

動作確認環境

  • iOS 13.4
  • Xcode 11.4.1

関連記事

iOSアプリ開発Tips/動画編集にて関連した記事をまとめています。

それ以外にも iOSアプリ開発で役立つ情報をまとめています。