0
1

アプリがバックグラウンドになるとcopyNextSampleBufferがnilを返す話

Last updated at Posted at 2023-10-12

iOSで動画をループで回して画像処理を行う際にcopyNextSampleBufferを使ったことがあると思います。

このcopyNextSampleBufferが曲者でアプリがバックグラウンドに移行するとnilを返します。

copyNextSampleBufferのドキュメントによると、
copyNextSampleBufferはエラーがある場合にnilを返すのでAVAssetReaderのstatusを見てねとのことです。
実際のコードではreader.status = .failedを確認するだけで十分動作することが確認できています。
そんなわけで今回は動画をresumeする処理を書いてみました。

コードの動作確認

今回用意したサンプルコードの動画です。
少しわかりにくいですが、アプリがバックグラウンドに移行するとretryのログが画面下部に追加されるのが解ると思います。
アプリをバックグラウンドにするには他のアプリを起動してから戻ると丁度良い塩梅のようです。
どうでもいい話ですが、動画に登場する猫はうちの猫です。

sample.gif

その他: copyNextSampleBufferでフレーム数を確認

AVAssetでは動画のメタ情報から動画の時間はわかりますがフレーム数はわかりません。
計算で求めることも出来なくはなさそうですが正しく求めるにはループしてカウントしろとのことです。

var count = 1
while let _ = trackOutput.copyNextSampleBuffer() {
  count += 1
}
return count

サンプルコード

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1