見出し画像

Visionでオフライン動画処理 - VNVideoProcessor

VNVideoProcessorはVisionにiOS 14, macOS 11.0で新規追加された、オフライン動画処理用のクラス。昨年はこの存在に気付かず、iOS 15の新APIチェックをしていて発見した。昨年のWWDCセッションでもおそらく触れられておらず、Appleのサンプルでも使用されておらず、GitHub検索してもわずか数個のリポジトリでしか使用されていない地味なAPIだが、個人的にはわりと「かゆいところに手が届く」系の嬉しい更新。

何が嬉しいのか

これまで動画ファイル等に対してVisionのビルトインの機能なりCore MLモデルなりで画像分類やら物体検出を行う場合、動画からフレームを抽出してから、

それぞれのフレーム画像に対してVisionの処理を行う、ということをやっていた。

これが、VNVideoProcessorを使うと、フレーム抽出を実装することなく、動画に対してVisionの処理を行うことができる。

実装が楽になるだけ?

上述のように書くと、フレームを抽出して各フレーム画像についてVisionの処理を行う、の実装分だけ楽になる、コードがスッキリする、ぐらいのメリットしかなさそうにも見える。

実際のところ、こういうの(フレーム抽出処理)は一度書いてしまえば使い回せるので、ここ自体はまったく苦労はない。少なくとも僕は動画からのフレーム抽出の実装は仕事でも自分のアプリでも使いまわしていて、オフライン動画処理を実装すること自体は一瞬でできる。

しかしまぁどんなものでも標準で用意されたなら、きっとそっちの方(自前実装よりも)が最適化されていていい感じに動く可能性が高い、とまずは考えるようにしている。

たとえば、フレーム抽出時には必ず動画エンコードが入る。これは(エンコード形式にもよるが)ハードウェアで処理される。

よくわからないが、もしかしたらその後のVisionの処理(GPU, Neural Engineも利用)といい感じに連携してくれてるとかあるかもしれない(なさそう)。

あと、Vision内部で結局各フレーム画像を単体で処理しているのではなくて、複数フレームを効率よく扱うようなことももしかしたら内部で行われているかもしれない。

VNVideoProcessor.RequestProcessingOptions, VNVideoProcessor.Cadence

VNVideoProcessorはリクエスト追加時にVNVideoProcessor.RequestProcessingOptions型でオプションを指定できる。

func addRequest(_ request: VNRequest, 
processingOptions: VNVideoProcessor.RequestProcessingOptions) throws

VNVideoProcessor.RequestProcessingOptionsには今のところcadenceプロパティしかない。

@NSCopying var cadence: VNVideoProcessor.Cadence? { get set }

これは、動画のフレームを抽出する頻度を指定するもの。

フレームレートで指定できるFrameRateCadenceと、

class FrameRateCadence : VNVideoProcessor.Cadence

タイムインターバルで指定できるTimeIntervalCadenceとがある。

class TimeIntervalCadence : VNVideoProcessor.Cadence

実装例

ここから先は

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

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

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