📽️

Apple Logに対応した動画を撮影する [iOS][Swift][AVCaptureSession]

2024/03/28に公開

kyu という動画撮影・共有アプリの開発を手伝っています。
直近のアップデートで撮影した動画の色味を少し変えるという対応が入っているのですが(この開発は僕じゃない)、
その中でApple Log形式で動画を撮影して色味を変えれたら高画質にできるんじゃないかと思ってApple Logでの撮影方法を調べてみました。

前提条件

Apple Log形式での動画の撮影に対応している端末である必要があります。
つまり、現時点(2024年3月)ではiPhone 15 Pro, iPhone 15 Pro Maxの2種類に絞られます。
ただし、これまでの傾向でProに導入された機能が翌年以降はProではない端末に導入されることがしばしばあるので、対応端末は年々増えることが予想できます。

実装方法

それでは本題の実装方法です。

  1. AVCaptureSessionautomaticallyConfiguresCaptureDeviceForWideColorfalse に設定(これが一番大事かもしれない)
  2. AVCaptureDeviceformats から supportedColorSpaces.appleLog が含まれているものを探して activeFormat に設定する
  3. AVCaptureDeviceactiveColorSpace = .appleLog を設定する

.appleLog の正体はこちら。

https://developer.apple.com/documentation/avfoundation/avcapturecolorspace/applelog

具体例

private func isAppleLogAvailable(for device: AVCaptureDevice) -> Bool {
    device.formats.first(where: {
        $0.supportedColorSpaces.contains(.appleLog)
    }) != nil
}

private func configureAppleLogIfNeeded(for device: AVCaptureDevice) throws {
    guard isAppleLogAvailable(for: device) else {
        return
    }

    try device.lockForConfiguration()
    defer {
        device.unlockForConfiguration()
    }

    /// set up for .appleLog
    if let format = device.formats.first(where: {
        $0.supportedColorSpaces.contains(.appleLog)
    }) {
        device.activeFormat = format
        device.activeColorSpace = .appleLog
    }
}

まとめ

これで最低限 AVCaptureSession でApple Logの色味を実現することができます。
ただし、端末への保存では60fpsの書き出しができなかったりするので、フレームレートの調整や保存時のフォーマット書き出し設定などは必要になってくると思います。(kyuでは結局Apple Logは使ってないので細かいところまでは調べてないです)
サンプルコードをGitHubにあげていますので、興味のある方は見てみてください。

https://github.com/fromkk/AppleLogSampler

追記(Special thanks)

@naoya_maeda さんにヒントをもらってなかったらできなかったのでありがとうございました!

Discussion