えむじぃのアプリ開発

えむじぃのアプリ開発

元大手IT企業SE、現ベンチャー企業CTOのブログです。

【Swift】カメラを使用する方法

今回はカメラを使用する方法をこの記事で説明します。

この記事のポイント・AVFoundationを使用

カメラを使用する方法

AVCaptureSession

初めにAVFoundationを設定します。

import UIKit
import AVFoundation

 

次に各メソッドを作成します。

// オブジェクトの作成
var avCapSession = AVCaptureSession()

// 画質の設定
func initCaptureSession() {
    avCapSession.sessionPreset = AVCaptureSession.Preset.photo
}

 

プリセット値は以下のような種類があります。

【low】
3Gでの共有に適した出力ビデオおよびオーディオビットレートに適したキャプチャ設定を指定します。

【medium】
WiFi経由での共有に適した出力ビデオおよびオーディオビットレートに適したキャプチャ設定を指定します。

【high】
高品質のビデオおよびオーディオ出力に適したキャプチャ設定を指定します。

【photo】
高解像度の写真品質出力に適したキャプチャ設定を指定します。

【inputPriority】
キャプチャセッションがオーディオおよびビデオの出力設定を制御しないことを指定します。

【qHD960x540】
クォーターHD品質(960 x 540ピクセル)のビデオ出力に適したキャプチャ設定を指定します。

【hd1280x720】
720p品質(1280 x 720ピクセル)のビデオ出力に適したキャプチャ設定を指定します。

【hd1920x1080】
1080p品質(1920 x 1080ピクセル)のビデオ出力に適したキャプチャ設定。

【hd4K3840x2160】
2160p品質(3840 x 2160ピクセル)のビデオ出力に適したキャプチャ設定。

【iFrame960x540】
AACオーディオで約30メガビット/秒で960x540品質のiFrameH.264ビデオを実現するためのキャプチャ設定を指定します。

【iFrame1280x720】
AACオーディオで約40メガビット/秒で1280x720品質のiFrameH.264ビデオを実現するためのキャプチャ設定を指定します。

【qvga320x240】
320 x240ピクセルのビデオ出力に適したキャプチャ設定を指定します。

【vga640x480】
VGA品質(640 x 480ピクセル)のビデオ出力に適したキャプチャ設定を指定します。

【cif352x288】
CIF品質(352 x 288ピクセル)のビデオ出力に適したキャプチャ設定を指定します。

 

AVCaptureDevice

次にデバイス本体の設定をします。

// メインカメラ
var mnCamera: AVCaptureDevice?
// インカメラ
var inCamera: AVCaptureDevice?
// 現在使用しているカメラ
var crDevice: AVCaptureDevice?

// デバイスの設定
func initDevice() {
    // プロパティ設定
    let deviceDiscoverySession = 
                AVCaptureDevice.DiscoverySession(
                    deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera],
                    mediaType: AVMediaType.video,
                    position: AVCaptureDevice.Position.unspecified)
                                         
    // カメラデバイスの取得
    let devices = deviceDiscoverySession.devices

    for device in devices {
        if device.position == AVCaptureDevice.Position.back {
            mnCamera = device
        } else if device.position == AVCaptureDevice.Position.front {
            inCamera = device
        }
    }
    // 起動時のカメラを設定
    crDevice = mainCamera
}

 

次に入出力データの設定をします。

// 出力データオブジェクト
var photoOutput : AVCapturePhotoOutput?

// 入出力データ
func initInputOutput() {
    do {
        // 初期化
        let captureDeviceInput = try AVCaptureDeviceInput(device: currentDevice!)
        // セッションに追加
        captureSession.addInput(captureDeviceInput)
        // 出力データ
        photoOutput = AVCapturePhotoOutput()
        // 出力ファイルフォーマット
        photoOutput!.setPreparedPhotoSettingsArray(
                        [AVCapturePhotoSettings(
                            format: [AVVideoCodecKey : AVVideoCodecType.jpeg])],
                            completionHandler: nil)
                            
        captureSession.addOutput(photoOutput!)
    } catch {
        print(error)
    }
}

 

次にカメラの表示設定をします。

// 表示用
var cameraPreviewLayer : AVCaptureVideoPreviewLayer?

// レイヤの設定
func initPreviewLayer() {
    // 初期化
    self.cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    
    // 縦横比を維持
    self.cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
    
    // 向きを設定
    self.cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait

    self.cameraPreviewLayer?.frame = view.frame
    self.view.layer.insertSublayer(self.cameraPreviewLayer!, at: 0)
}

 

最後に各メソッドをViewControllerから呼び出します。

override func viewDidLoad() {
    super.viewDidLoad()
    initCaptureSession()
    initDevice()
    initInputOutput()
    initPreviewLayer()
    captureSession.startRunning()
}

 

これでカメラを使用できるようになります。