【swift】AVFoundationを使って、動画の撮影を行う!

こんにちは。
先日以下のような記事を書かせていただきました。

kz-ike.hatenablog.com


前回は、AVFoundationに関する概念のお話でしたので、今回の記事では「動画を撮影する際に使用するクラス、及び必須設定項目」についてまとめようと思います。

※動画を追加する設定項目についてのみ説明するため、sessionクラスへinputを追加するや、session自体の開始といった方法は省略します。

最初に

動画を撮影して表示しるソースは以下に格納しました。

sampleAVFoundation/avFoundation at main · d-ike99/sampleAVFoundation · GitHub

AVFoundationに関するコードは、「ViewController.swift」に全て記載してます!

動画を撮影するのに必要なクラス

クラス名 概念
AVCaptureSession インプット、アウトプットに関する「セッション」を制御する
AVCaptureDeviceInput AVCaptureSessionの入力データとして定義するもの
AVCaptureVideoDataOutput インプットで取得した動画に対して、「記録」、「1フレーム毎へのアクセス」を可能とするアウトプットクラス

各クラスで必要な設定

AVCaptureSession

設定項目
変数 説明
sessionPreset AVCaptureSession.Preset アウトプットの解像度、ビットレートを定義する
補足

下記リンクで、Presetに定義できる変数がまとめられています。
それぞれの変数がどういったシーンで有効か全て把握できてませんが、上記のgithubでのサンプルプログラムでは「hd1920x1080」を指定しています。

https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture

AVCaptureDeviceInput

設定項目
変数 説明
device AVCaptureDevice インプットとしてどのデバイス(マイク、カメラなど)を使用するか定義する
補足

動画を撮影する際に指定するコードです。

guard let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .front) else {
    return
}

// インプットの定義
guard  let createInputInfo = try? AVCaptureDeviceInput(device: captureDevice) else {
    return
}

AVCaptureVideoDataOutput

設定項目
変数 説明
videoSettings [string: Any] 撮影した動画(画像)のフォーマットを設定する
alwaysDiscardsLateVideoFrame bool 「撮影したフレーム」のデータを、すぐに削除せずにメモリに残しておくかを指定する。単純に動画を表示するだけなら基本trueで問題ない
setSampleBufferDelegate - ・sample buffer(撮影した動画の一枚一枚のフレーム情報)の出力先の指定(delegateを定義する)
・上記delegateを呼び出すためのqueueの指定
補足

今回の記事では特に触れませんが、「マルチスレッド」の概念を抑えておくとコードを読みやすいです。
今回の動画を撮影するケースですと、以下のようなスレッドが登場すると思います。

①動画を撮影するスレッド
②撮影した動画の一枚一枚のフレームを出力するスレッド(setSampleBufferDelegateで定義するqueue)

videoOutput.setSampleBufferDelegate(self, queue: sessionQueue)

③「sample buffer」として取得した画像を、「画面に表示するため」のスレッド

DispatchQueue.main.sync {
    self.dispFrame(didCaptureFrame: image)
}


↓マルチスレッドを勉強した参考リンク
【Swift】Grand Central Dispatch (GCD)とOperationQueue まとめ - Qiita

さいごに

今回は、動画の撮影方法のみ言及しましたが、動画を保存するとなると別途手順が必要です。
私たちが何気なく使っている「カメラアプリ」もいろんな技術が詰まっていると改めて実感しました・・・!