iOSで動画をループで回して画像処理を行う際にcopyNextSampleBufferを使ったことがあると思います。
このcopyNextSampleBufferが曲者でアプリがバックグラウンドに移行するとnilを返します。
copyNextSampleBufferのドキュメントによると、
copyNextSampleBufferはエラーがある場合にnilを返すのでAVAssetReaderのstatusを見てねとのことです。
実際のコードではreader.status = .failed
を確認するだけで十分動作することが確認できています。
そんなわけで今回は動画をresumeする処理を書いてみました。
コードの動作確認
今回用意したサンプルコードの動画です。
少しわかりにくいですが、アプリがバックグラウンドに移行するとretryのログが画面下部に追加されるのが解ると思います。
アプリをバックグラウンドにするには他のアプリを起動してから戻ると丁度良い塩梅のようです。
どうでもいい話ですが、動画に登場する猫はうちの猫です。
その他: copyNextSampleBufferでフレーム数を確認
AVAssetでは動画のメタ情報から動画の時間はわかりますがフレーム数はわかりません。
計算で求めることも出来なくはなさそうですが正しく求めるにはループしてカウントしろとのことです。
var count = 1
while let _ = trackOutput.copyNextSampleBuffer() {
count += 1
}
return count
サンプルコード