カテゴリー: iOS

[Swift]カメラデバイスで使用できる解像度の中で、最大のサイズを設定する

はじめに

iOSでカメラの映像を画面に表示することは多々あると思いますが、今回はカメラデバイスが使用できるフォーマットの取得し反映させる方法を解説したいと思います。

フォーマット一覧の取得

では早速フォーマットの一覧を取得したいと思います。
まずはフォーマットを取得したいデバイスを取得します。今回はフロントカメラを取得します。

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
    }
}

デバイスからフォーマットの一覧を取得し、中を見ていきたいと思います。

let availableFormats : [AVCaptureDevice.Format] = device!.formats
for format : AVCaptureDevice.Format in availableFormats {
    print("format: " + format.description)
}

そうすると以下のようなログが吐き出されます。

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を書き換える必要がありますが、その際デバイスをロックする必要があるので下記のように設定します。

do {
    try device?.lockForConfiguration()
    device?.activeFormat = format
    device?.unlockForConfiguration()
} catch {
    print("error")
}

使用したいフォーマットを選択するために、フォーマットから解像度を取得します。formatDescriptionからCMVideoFormatDescriptionGetDimensionsを使用して幅と高さを取得します。

let desc = format.formatDescription
let dimensions = CMVideoFormatDescriptionGetDimensions(desc)
// 幅
dimensions.width
// 高さ
dimensions.height

それでは上記で取得したフォーマットの中に「3088×2320」の解像度があったので、こちらを設定したいと思います。

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")
        }
    }
}

カメラデバイスで使用できる解像度の中で、最大のサイズを設定する

上記までの処理を参考にして、本ブログのタイトル通り、カメラデバイスで使用できる解像度の中で、最大のサイズを設定したいと思います。

// デバイスの取得
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")
    }
}

さいごに

端末の種類も増え、設定できるフォーマットも多様になってきたので、アプリに合わせたフォーマットを設定する必要があると思います。

おすすめ書籍

nukky

シェア
執筆者:
nukky
タグ: Swift

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前