

現在、以下のようなコードを作成して実機（iPhone7plus）での動作確認を行なっています。

[code]

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
        // デバイスからの入力と出力を管理するオブジェクトの作成
        var captureSession = AVCaptureSession()
        // カメラデバイスそのものを管理するオブジェクトの作成
        // メインカメラの管理オブジェクトの作成
        var mainCamera: AVCaptureDevice?
        // インカメの管理オブジェクトの作成
        var innerCamera: AVCaptureDevice?
        // 現在使用しているカメラデバイスの管理オブジェクトの作成
        var currentDevice: AVCaptureDevice?
        // キャプチャーの出力データを受け付けるオブジェクト
        var photoOutput : AVCapturePhotoOutput?
        // プレビュー表示用のレイヤ
        var cameraPreviewLayer : AVCaptureVideoPreviewLayer?
        
        override func viewDidLoad() {
            super.viewDidLoad()
            setupCaptureSession()
            setupDevice()
            setupInputOutput()
            setupPreviewLayer()
            captureSession.startRunning()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }
    
    //カメラ設定メソッド
    extension ViewController{
        // カメラの画質の設定
        func setupCaptureSession() {
            captureSession.sessionPreset = AVCaptureSession.Preset.photo
        }
        
        // デバイスの設定
        func setupDevice() {
            // カメラデバイスのプロパティ設定
            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 {
                    mainCamera = device
                } else if device.position == AVCaptureDevice.Position.front {
                    innerCamera = device
                }
            }
            // 起動時のカメラを設定
            currentDevice = mainCamera
            
            configureDevice(device: currentDevice!)
        }
    
        // フレームレートとisoの設定
        func configureDevice(device: AVCaptureDevice) {
            if device.isFocusModeSupported(.continuousAutoFocus) {
                device.focusMode = .continuousAutoFocus
            }
            let shutterSpeed = CMTimeMake(value: 1, timescale: 1000)
            device.setExposureModeCustom(duration: shutterSpeed, iso: 10, completionHandler: nil)
        }
        
        // 入出力データの設定
        func setupInputOutput() {
            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)
            }
        }
    
        // カメラのプレビューを表示するレイヤの設定
        func setupPreviewLayer() {
            // 指定したAVCaptureSessionでプレビューレイヤを初期化
            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)
        }
    }
    
    
[/code]

以下の部分で表示する映像のシャッタースピードやISOの設定を行なっているのですが、値を変更しても映像が変化していないように見受けられます。

[code]

    func configureDevice(device: AVCaptureDevice) {
            if device.isFocusModeSupported(.continuousAutoFocus) {
                device.focusMode = .continuousAutoFocus
            }
            let shutterSpeed = CMTimeMake(value: 1, timescale: 1000)
            device.setExposureModeCustom(duration: shutterSpeed, iso: 400, completionHandler: nil)
            
        }
    
[/code]

setExposureModeCustomの使い方に問題があるのでしょうか。  
ご存知の方がいらっしゃいましたらご教授いただけますと幸いです。


CC BY-SA 4.0
2021-07-20T10:07:19.980
78321
2021-07-21T02:32:11.227
2021-07-21T02:32:11.227
46924
46924
question
swift ios
カメラを起動して取得した映像のシャッタスピードやISOを変更したい