はじめに
iOSでカメラの映像を画面に表示することは多々あると思いますが、今回はカメラデバイスが使用できるフォーマットの取得し反映させる方法を解説したいと思います。
フォーマット一覧の取得
では早速フォーマットの一覧を取得したいと思います。
まずはフォーマットを取得したいデバイスを取得します。今回はフロントカメラを取得します。
1 2 3 4 5 6 7 8 9 10 11 | var device:AVCaptureDevice? let position = AVCaptureDevice.Position.front let deviceDiscoverySession = AVCaptureDevice .DiscoverySession(deviceTypes:[AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video,position:position) let devices = deviceDiscoverySession.devices for item in devices { if item.position == position{ device = item } } |
デバイスからフォーマットの一覧を取得し、中を見ていきたいと思います。
1 2 3 4 | let availableFormats : [AVCaptureDevice.Format] = device!.formats for format : AVCaptureDevice.Format in availableFormats { print("format: " + format.description) } |
そうすると以下のようなログが吐き出されます。
1 2 3 | format: <AVCaptureDeviceFormat: 0x2824801d0 'vide'/'420v' 192x 144, { 2- 30 fps}, HRSI:3088x2320, fov:56.559, max zoom:145.00 (upscales @16.08), ISO:19.0-1824.0, SS:0.000013-0.500000> // 中略 format: <AVCaptureDeviceFormat: 0x282480360 'vide'/'420f' 3088x2320, { 2- 30 fps}, HRSI:3088x2320, fov:56.559, max zoom:145.00 (upscales @1.00), ISO:19.0-1824.0, SS:0.000013-0.500000, supports wide color, supports still image only depth> |
使用できるフォーマットの解像度や、FPSなどが確認できます。
フォーマットを設定する
それでは実際にデバイスに使用したいフォーマットを設定したいと思います。フォーマットを設定するには取得したデバイスのactiveFormatを書き換える必要がありますが、その際デバイスをロックする必要があるので下記のように設定します。
1 2 3 4 5 6 7 | do { try device?.lockForConfiguration() device?.activeFormat = format device?.unlockForConfiguration() } catch { print("error") } |
使用したいフォーマットを選択するために、フォーマットから解像度を取得します。formatDescriptionからCMVideoFormatDescriptionGetDimensionsを使用して幅と高さを取得します。
1 2 3 4 5 6 | let desc = format.formatDescription let dimensions = CMVideoFormatDescriptionGetDimensions(desc) // 幅 dimensions.width // 高さ dimensions.height |
それでは上記で取得したフォーマットの中に「3088×2320」の解像度があったので、こちらを設定したいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | let availableFormats : [AVCaptureDevice.Format] = device!.formats for format : AVCaptureDevice.Format in availableFormats { let desc = format.formatDescription let dimensions = CMVideoFormatDescriptionGetDimensions(desc) if dimensions.width == 3088 && dimensions.height == 2320 { do { try device?.lockForConfiguration() device?.activeFormat = format device?.unlockForConfiguration() } catch { print("error") } } } |
カメラデバイスで使用できる解像度の中で、最大のサイズを設定する
上記までの処理を参考にして、本ブログのタイトル通り、カメラデバイスで使用できる解像度の中で、最大のサイズを設定したいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // デバイスの取得 var device:AVCaptureDevice? let position = AVCaptureDevice.Position.front let deviceDiscoverySession = AVCaptureDevice .DiscoverySession(deviceTypes:[AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video,position:position) let devices = deviceDiscoverySession.devices for item in devices { if item.position == position{ device = item } } // フォーマットの取得 var maxResolutionFormat: AVCaptureDevice.Format? let availableFormats : [AVCaptureDevice.Format] = device!.formats var maxResolution:Int32 = 0 for format : AVCaptureDevice.Format in availableFormats { let desc = format.formatDescription let dimensions = CMVideoFormatDescriptionGetDimensions(desc) let resolution = dimensions.width * dimensions.height if resolution > maxResolution { maxResolution = resolution maxResolutionFormat = format } } // フォーマットの設定 if let format = maxResolutionFormat { do { try device?.lockForConfiguration() device?.activeFormat = format device?.unlockForConfiguration() } catch { print("error") } } |
さいごに
端末の種類も増え、設定できるフォーマットも多様になってきたので、アプリに合わせたフォーマットを設定する必要があると思います。