📹

AppleのAVCamのサンプルでmaxPhotoDimensionsプロパティについて調べておく

2024/06/06に公開

はじめに

AVCapturePhotoOutputisHighResolutionCaptureEnabledが非推奨になり、警告としてmaxPhotoDimensionsを使えというメッセージが出るようになっていた。

Appleの公式でカメラアプリ用のサンプルからそれが何かを考えてみる。

https://developer.apple.com/documentation/avfoundation/capture_setup/avcam_building_a_camera_app

最初に結論

AppleのサンプルはconfigurePhotoOutputメソッドでInputのlastをOutputに指定しているが、
これはInputの設定によって変わり、Outputに指定しても絶対反映されるわけでもない。
たとえば設定によっては8064x6048のサイズがInputのsupportedMaxPhotoDimensionsとして取得できる。
それをOutputに指定しても、そのまま8064x6048のサイズにはならない(できるやり方はあるとは思う)。
つまり、maxはあくまで最大値を決めていて、Output側で適切にやる方法が必要だと "思う"。
ちなみに最大値だからなんでも設定できるわけじゃなく、適当に指定できるわけじゃない。エラー出る。
特にこだわりがなければInputとOutputをsessionにつないだら適切な値がデフォルトで設定もされる。
ここはあくまでサンプルとしてこの値を変更できるよ、ということだけを示すサンプルとして受け取るのが良さそう。

    private func configurePhotoOutput() {
        let supportedMaxPhotoDimensions = self.videoDeviceInput.device.activeFormat.supportedMaxPhotoDimensions
        let largestDimesnion = supportedMaxPhotoDimensions.last
        // ここ! ここでlast指定してるのはもうちょっと説明が欲しいよね!!!
        self.photoOutput.maxPhotoDimensions = largestDimesnion!
        self.photoOutput.isLivePhotoCaptureEnabled = self.photoOutput.isLivePhotoCaptureSupported
        self.photoOutput.maxPhotoQualityPrioritization = .quality
        self.photoOutput.isResponsiveCaptureEnabled = self.photoOutput.isResponsiveCaptureSupported
        self.photoOutput.isFastCapturePrioritizationEnabled = self.photoOutput.isFastCapturePrioritizationSupported
        self.photoOutput.isAutoDeferredPhotoDeliveryEnabled = self.photoOutput.isAutoDeferredPhotoDeliverySupported
        
        let photoSettings = self.setUpPhotoSettings()
        DispatchQueue.main.async {
            self.photoSettings = photoSettings
        }
    }

maxPhotoDimensionsとは

関連する奴ら

  • Input
    • AVCaptureDevice.FormatsupportedMaxPhotoDimensions
      • Input側が対応しているw,hを配列で返す
        • 予想
          • maxなのになぜ配列?
            • Input側の設定でアスペクト比が一緒でも異なるmaxがある
              • おそらくProRawのときに極大のw,hが選べる
                • 極大のw,hを選んでもCaputre側で対応してなければ出力されないしエラーにならないからそれは安心
                • サンプルではlast!を指定している
  • Output
    • AVCapturePhotoOutputmaxPhotoDimensions
      • Input側のsupportedMaxPhotoDimensionsと同じじゃないといけない
  • PhotoOutput(キャプチャ)
    • AVCapturePhotoSettingsmaxPhotoDimensions
      • キャプチャして写真データにする際に利用される
        • これはAVCapturePhotoOutputmaxPhotoDimensionsにある設定がデフォルトで指定されるはず
          • ドキュメントによると同じか小さいか
            • 試した感じ、AVCapturePhotoOutputmaxPhotoDimensionsと全く同じじゃないとエラー
              • だったらもう設定させないでくれよ!!

結論としてInputのw,hしかOutput側のw,hとして設定できず、写真として出力する際もw,hはそのOutputと同じものじゃないとエラーになる。

たとえば、Outputと比率が同じでPhotoOutputを1/2に小さくするというのはできない。正直、現状自分で設定する必要性を感じないが(デフォルトで最大値が勝手に選択される)、もしかしたらInput側をカスタムして設定していく際に、おそらく出力する際にでかいサイズが反映されることもあるんだと思う。

その他: AVCaptureSessionは次のような関係がある

Discussion