Quantcast
Channel: その後のその後
Viewing all articles
Browse latest Browse all 314

[iOS][Objective-C]AV Foundationで120fpsスローモーション動画撮影を実装する

$
0
0

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で諸々教えていただきました。ありがとうございました!


関連


AVFoundationを使うレシピは、下記書籍にもいくつか書いたのでもしよろしければ。


『iOSアプリ開発 達人のレシピ100』という本を書きました - Over&Out その後


*1:寒かったので外に出てすぐ目の前にあったこれを撮影しました。

*2:本当に120fpsなのかというのはわかりづらいかもしれませんが、Photoshopにimportして確認もしたので間違いないです。


Viewing all articles
Browse latest Browse all 314

Trending Articles