動画から画像を切り出す時の処理時間を計測した
macOSで動画ファイルから画像を切り出す時にAVFoundationのAVAssetImageGeneratorクラスの
func generateCGImagesAsynchronously(forTimes requestedTimes: [NSValue], completionHandler handler: @escaping AVAssetImageGeneratorCompletionHandler)
を使っている。
この最初の引数に欲しい画像の時刻に相当する値の配列を渡せばまるっとまとめてcompetionHandlerでくれる。
長い動画に対して処理をするとそこそこの時間、Macが固まることになる!
描画のタイミングはないからNSProgressIndicatorを書き換えることもできない。
ユーザーからすると、ちゃんと処理は進んでいるんだろうか?と心配になってしまう。
なのでなんとか途中で描画のタイミングを作って少しずつ画像を作成していくという方法を考えた。
心配なのはどのくらい時間のロスが発生するんだろうか?ということだ。
ということで一定枚数ごとに分割して画像を作成したらどうなるかを計測してみた。
全部で35枚の動画を作成する処理をn枚ごとに行った。
5枚ごとなら7回のループでちょうどだけど、
10枚ごとなら4回のループになり、4回目は枚数が少ない。
XCTest(ユニットテスト)のmeasureというのを使うとデフォルトで10回処理してその平均などを出してくれる。
結果をグラフにするとこんな感じ。

そりゃ、まあ1回(横軸が35のところ)が最速になるよな。これを基準にすると、、、

1枚ごとなら15%ほど余計に時間がかかるけど、progress indicatorを書き換えるのなら1枚ごとじゃなくてもいいだろう。
10枚ごとなら4%ほどのロスだがこれで時々進捗を描けるならこっちの方がいいかな。

↑NSProgressIndicator。描画タイミングなくても逐次書き換えてくれるようになったらいいのにな。SwiftUIに期待?!
macOS 10.15.5 Catalina
Xcode 11.5
Swift 5.2.4
func generateCGImagesAsynchronously(forTimes requestedTimes: [NSValue], completionHandler handler: @escaping AVAssetImageGeneratorCompletionHandler)
を使っている。
この最初の引数に欲しい画像の時刻に相当する値の配列を渡せばまるっとまとめてcompetionHandlerでくれる。
長い動画に対して処理をするとそこそこの時間、Macが固まることになる!
描画のタイミングはないからNSProgressIndicatorを書き換えることもできない。
ユーザーからすると、ちゃんと処理は進んでいるんだろうか?と心配になってしまう。
なのでなんとか途中で描画のタイミングを作って少しずつ画像を作成していくという方法を考えた。
心配なのはどのくらい時間のロスが発生するんだろうか?ということだ。
ということで一定枚数ごとに分割して画像を作成したらどうなるかを計測してみた。
全部で35枚の動画を作成する処理をn枚ごとに行った。
5枚ごとなら7回のループでちょうどだけど、
10枚ごとなら4回のループになり、4回目は枚数が少ない。
XCTest(ユニットテスト)のmeasureというのを使うとデフォルトで10回処理してその平均などを出してくれる。
結果をグラフにするとこんな感じ。

そりゃ、まあ1回(横軸が35のところ)が最速になるよな。これを基準にすると、、、

1枚ごとなら15%ほど余計に時間がかかるけど、progress indicatorを書き換えるのなら1枚ごとじゃなくてもいいだろう。
10枚ごとなら4%ほどのロスだがこれで時々進捗を描けるならこっちの方がいいかな。

↑NSProgressIndicator。描画タイミングなくても逐次書き換えてくれるようになったらいいのにな。SwiftUIに期待?!
macOS 10.15.5 Catalina
Xcode 11.5
Swift 5.2.4
スポンサーサイト