【swift】AVFoundationを使って、動画の撮影を行う!
こんにちは。
先日以下のような記事を書かせていただきました。
前回は、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
さいごに
今回は、動画の撮影方法のみ言及しましたが、動画を保存するとなると別途手順が必要です。
私たちが何気なく使っている「カメラアプリ」もいろんな技術が詰まっていると改めて実感しました・・・!