👽

AVCapture完全初歩的最強マニュアル!!!

2024/05/06に公開

AVCaptureで写真を撮る方法を解説

時間がないのでどんどん書いていく!

AVCaptureDevice.default

指定されたデバイスタイプ、メディアタイプ、および位置のデフォルトデバイスを返すメソッド

class func `default`(
    _ deviceType: AVCaptureDevice.DeviceType,
    for mediaType: AVMediaType?,
    position: AVCaptureDevice.Position
) -> AVCaptureDevice?

最初の引数 deviceType

要求するキャプチャデバイスのタイプを指定する引数です。マイクやカメラ、LiDARにもアクセスが可能です。
また、カメラは内カメと外カメだけではなく広角カメラや望遠カメラも指定できる。
多いので公式ドキュメント見て!
https://developer.apple.com/documentation/avfoundation/avcapturedevice/devicetype

2番目の引数 for mediaType

メディアタイプを指定する引数です。カメラの場合はvideoを指定します。

多いので公式ドキュメント見て!
https://developer.apple.com/documentation/avfoundation/avmediatype

最後の引数 position

システムハードウェア(前面または背面)に対して要求するキャプチャデバイスの位置を指定する。

  1. case front
  2. case back
  3. case unspecified
    の3タイプある。

AVCaptureDeviceInput(device:)

カメラやマイクなどのキャプチャデバイスをAVCaptureSessionに接続するためのインプットを提供します。
先ほど、AVCaptureDevice.defaultで指定したデバイス情報を設定するクラスです。
デバイスをキャプチャセッションに接続するために使用します。

let device = AVCaptureDevice.default(.builtInDualWideCamera, for: .video, position: .back)

AVCaptureDeviceInput(device: device)

AVCaptureSession

ビデオキャプチャや静止画のキャプチャを管理するためのクラスです。AVCaptureSessionは、カメラやマイクなどのキャプチャデバイスからの入力を受け取り、それをビデオファイルや静止画に記録したり、リアルタイムで処理したりするためのインタフェースを提供します。

startRunning()

キャプチャパイプラインを通るデータの流れを開始します。

AVCapturePhotoOutput

静止画のキャプチャを管理するための出力を提供します。
静止画の基本的なキャプチャに加えて、写真出力はRAW形式のキャプチャ、複数の画像のブラケットキャプチャ、Live Photos、広色域カラーをサポートします。

userInterfaceIdiom

バイスまたはビューやビューコントローラーなどの特性環境を持つオブジェクトのインターフェイスタイプを示す定数。

  • phone
  • ipad

などがある。

https://developer.apple.com/documentation/uikit/uiuserinterfaceidiom

sessionPreset

出力の品質レベルまたはビットレートを示すプリセット値です。

品質レベル

  • static let high: AVCaptureSession.Preset
    高品質の出力をキャプチャするのに適したプリセット。
  • static let medium: AVCaptureSession.Preset
    中品質の出力をキャプチャするのに適したプリセット。
  • static let low: AVCaptureSession.Preset
    低品質の出力をキャプチャするのに適したプリセット。

写真に特化

  • tatic let photo: AVCaptureSession.Preset
    高解像度の写真品質出力をキャプチャするのに適したプリセット。
     switch UIDevice.current.userInterfaceIdiom {
        case .phone:
            session.sessionPreset = .high
        default:
            session.sessionPreset = .photo
        }

addInput

func addInput(_ input: AVCaptureInput)

セッションにキャプチャ入力を追加します。
AVCaptureDeviceInputを代入する。

guard let device = AVCaptureDevice.default(.builtInDualWideCamera, for: .video, position: .back),
      let deviceInput = try? AVCaptureDeviceInput(device: device) else {
            return
        }
let session = AVCaptureSession()
//このような形でインプットをセッションに追加する。
session.addInput(deviceInput)

addOutput

func addOutput(_ output: AVCaptureOutput)

キャプチャセッションに出力を追加します。

let photoOutput = AVCapturePhotoOutput()
let session = AVCaptureSession()

session.addOutput(photoOutput)

AVCaptureVideoPreviewLayer

カメラデバイスからビデオを表示するコアアニメーションレイヤーです。

class AVCaptureVideoPreviewLayer : CALayer

このレイヤーを使用して、カメラがキャプチャしたコンテンツのプレビューを提供します。
カメラの映像をリアルタイムでプレビューするためのインタフェースをアプリケーションに組み込むことができます。
カメラアプリで外カメを起動しているときに画面で外カメが見ている映像が見えるようにしている。

videoGravity

このプロパティには、ビデオを表示する際のアスペクト比やサイズの調整方法を制御するための値が設定されます。

  • static let resize: AVLayerVideoGravity
    ビデオはレイヤーの境界を埋めるために伸びます。
  • static let resizeAspect: AVLayerVideoGravity
    ビデオはアスペクト比を維持し、レイヤーの境界内に収まります。
  • static let resizeAspectFill: AVLayerVideoGravity
    ビデオはアスペクト比を保持し、レイヤーの境界を埋めます。

videoOrientation

カメラキャプチャのビデオの方向を指定するために使用されます。ビデオの方向を適切に指定することで、ビデオが正しい向きでキャプチャされ、表示されることが保証されます。

非推奨になっているので、iOS17向けにはvideoRotationAngleを使う。
このプロパティの値は、キャプチャされたビデオフレームの回転角度を度数で示します。例えば、0度、90度、180度、270度などがあります。

let videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)
    videoPreviewLayer.videoGravity = .resizeAspect
    videoPreviewLayer.connection?.videoOrientation = .portrait

iOS17
    videoPreviewLayer.connection?.videoRotationAngle = .pi

insertSublayer

insertSublayerは、CALayerオブジェクトに対して、指定された位置に別のCALayerオブジェクトを追加するメソッドです。CALayerは、Core Animationフレームワークでビューの描画やアニメーションを管理するためのクラスであり、UIViewのバックグラウンドに相当します。

  • layer: 追加するCALayerオブジェクト。
  • index: 追加する位置を示すインデックス。この位置に指定されたCALayerが挿入されます。0から始まるインデックスです。

カメラ撮影

AVFoundationフレームワークで使用されるクラスであり、静止画のキャプチャ時の機能と設定を管理するためのオブジェクトです。このクラスを使用することで、カメラからの静止画キャプチャ時にさまざまなパラメーターを設定することができます。
例えば、
flashModeでフラッシュの有無を設定できる。
maxPhotoDimensionsでキャプチャする写真の最大解像度を指定できる。

フォーマットもセットできる。
jpegにする場合

let photoSettings = AVCapturePhotoSettings()
photoSettings.format = [AVVideoCodecKey: AVVideoCodecType.jpeg]

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

capturePhoto(with:delegate:)

指定された設定を使用して写真キャプチャを開始します。
このメソッドは、指定された設定でカメラから静止画をキャプチャし、指定されたデリゲートに結果を通知します。

引数のwithに上記のセッティングを入れて、delegateにselfを入れる。

let photoOutput = AVCapturePhotoOutput()
let photoSetting = AVCapturePhotoSettings()
photoOutput.capturePhoto(with: photoSettings, delegate: self)

カメラ撮影の流れ

  1. AVCapturePhotoSettingsのインスタンスを作成します。
  2. キャプチャの設定を行います。フォーマット、解像度、フラッシュの使用などを指定します。
  3. AVCapturePhotoOutputのcapturePhoto(with:delegate:)メソッドを使用して静止画をキャプチャします。この際、AVCapturePhotoSettingsオブジェクトをメソッドに渡します。

photoOutput

photoOutput(_:didFinishProcessingPhoto:error:)は、AVCapturePhotoOutputのデリゲートメソッドであり、静止画のキャプチャが完了し、処理が終了した後に呼び出されます。
このメソッドは、静止画のキャプチャ結果やエラーを処理するために使用されます。

photoOutput(_:didFinishProcessingPhoto:previewPhoto:resolvedSettings:bracketSettings:error:)
  • output: AVCapturePhotoOutputオブジェクト自体を指定します。
  • photo: キャプチャされた静止画を表すAVCapturePhotoオブジェクトです。
  • error: エラーが発生した場合に渡されるErrorオブジェクトです。エラーがない場合はnilが渡されます。

fileDataRepresentation()

写真とその添付ファイルのフラットなデータ表現を生成し返します.

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        
        let photoData = photo.fileDataRepresentation()
UIImage(data: photoData)
}

以上で撮影してUIImageで取得することができます。

Discussion