iPhone5sだけのスペシャルな機能として、秒間120コマでの高速撮影 があり、標準カメラアプリではこれを利用した スローモーション動画撮影機能 が可能となっています。
これに類する機能をAVFoundationで実装できないかやってみたところ、うまくいったので、その方法を紹介します。
できたもの
サンプルアプリをGitHubにアップしております。
スクショ下部にあるように、 デフォルト / 60fps / 120fps を切り替えられるようになっています。
このアプリを使って撮ったものがこちら *1。
120fps Slow-Motion video recorded using AVFoundation.
(中盤をスローモーションにしています *2。)
実装方法
わりと複雑な処理になったので、AVFoundation関連の処理を全部ラップしたクラスをつくりました。
そのラッパークラス『AVCaptureManager』を使うと、下記のように3行で実装できます。
1. 初期化
self.captureManager = [[AVCaptureManager alloc] initWithPreviewView:self.view];
2. 録画開始
[self.captureManager stopRecording];
3. 録画停止
[self.captureManager stopRecording];
停止したときに撮影した動画を保存する、とかはデリゲートメソッドを使用します。そのあたりはサンプルをご参照ください。
また今はこのサンプルの用途しか考慮されてないAPIになっているのですが、これから動画処理とかは積極的にやっていくので、随時拡張していく所存です。
ラッパーを使わない実装
大部分はAVCapture〜で動画撮影する場合の一般的な処理で、120fps実装ならではのポイントは AVCaptureManager の次の部分に集約されています。
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceFormat *selectedFormat = nil; AVFrameRateRange *frameRateRange = nil; for (AVCaptureDeviceFormat *aFormat in [videoDevice formats]) { for (AVFrameRateRange *range in aFormat.videoSupportedFrameRateRanges) { if (range.maxFrameRate >= desiredFPS) { selectedFormat = aFormat; frameRateRange = range; } } } if (selectedFormat) { if ([videoDevice lockForConfiguration:nil]) { NSLog(@"selected format:%@", selectedFormat); videoDevice.activeFormat = selectedFormat; videoDevice.activeVideoMinFrameDuration = frameRateRange.minFrameDuration; videoDevice.activeVideoMaxFrameDuration = frameRateRange.maxFrameDuration; [videoDevice unlockForConfiguration]; } }
処理の内容としては、
- AVCaptureDevice の formats プロパティから使用可能なフォーマットのリストを取得
- その中から所望のfpsを満たすものを探索
- 見つかれば AVCaptureDevice の activeFormat プロパティにセットする
ということを行っています。
Special Thanks!!
@hkato193 さんにTwitterで諸々教えていただきました。ありがとうございました!
関連
- iOS のオーディオ/サウンド処理について学べる書籍10冊+α - Over&Out その後
- シャッター音の鳴らないカメラアプリの実装方法 - Over&Out その後
- 【その1】UIImagePickerController を使わないカメラアプリの実装方法 - Over&Out その後
- AVFoundation 使用時のカメラ起動を高速化する - Over&Out その後
- ダウンロード可能な Audio Unit 関連のサンプルコード11個 - Over&Out その後
- PerfumeのモーションキャプチャデータをiOSアプリ内で動かしてみる - Over&Out その後
AVFoundationを使うレシピは、下記書籍にもいくつか書いたのでもしよろしければ。
『iOSアプリ開発 達人のレシピ100』という本を書きました - Over&Out その後