その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

AVFoundation 使用時のカメラ起動を高速化する

AVFoundation を用いて静止画とか動画とかを撮影する場合に、カメラの起動時間を速くする方法です。


計測してみると、どうも AVCaptureSession の startRunning に一番時間がかかってるので、

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
    
    [self.captureSession startRunning];

    dispatch_async(dispatch_get_main_queue(), ^{
        
        // メインスレッドでの処理(UIまわり)
    });
});

こうすることで体感起動時間を速くできました。
(要は startRunning をバックグラウンドで処理するだけ)


ただ、AVCaptureSession の startRunning は非同期で行われていてそれ自体は速くはなっていないので、プレビュー用の AVCaptureVideoPreviewLayer を使い回している場合は、カメラ画面に遷移したあと startRunning が完了するまでの間、プレビューレイヤに前回撮影時の画像が描画されたままだったりします。その場合は、

self.previewLayer.hidden = YES;

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{

    [self.captureSession startRunning];

    dispatch_async(dispatch_get_main_queue(), ^{
        
        self.previewLayer.hidden = NO;
        
        // メインスレッドでの処理(UIまわり)
    });
});

こんな感じで出したり隠したりして対処しました。


僕の実装ケースにしか当てはまらないのかもしれませんが・・