質問編集履歴

4 コードの編集

退会済みユーザー

退会済みユーザー

2017/02/13 20:25  投稿

AVCaptureVideoDataOutputのカメラの露出時間を取得する方法
###前提・実現したいこと
AVFoundationを使い、任意の場所をタッチするとそこに露出が合う
カスタムカメラを作成しました。
その露出時間での撮影と、その露出時間から±1の露出時間での撮影を行いたいです。
そこでカメラ画面をタップしたとき(キャプチャする前)の露光時間を取得したいのですが、やり方がわかりません。
宜しくお願いします。
###該当のソースコード
```Swift3
        let maxISO = myDevice.activeFormat.maxISO
        let minISO = myDevice.activeFormat.minISO
        let currentISO = (maxISO + minISO)/2
        do {
            try myDevice.lockForConfiguration()
            // tapで設定された値で撮影する  
            myDevice.setExposureModeCustomWithDuration(AVCaptureExposureDurationCurrent, iso: curentISO, completionHandler: {(time) -> Void in
            })
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)
            }
            myDevice.setExposureModeCustomWithDuration(AVCaptureExposureDurationCurrent, iso: maxISO, completionHandler: {(time) -> Void in
            })
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)
            }
            myDevice.setExposureModeCustomWithDuration(AVCaptureExposureDurationCurrent, iso: minISO, completionHandler: {(time) -> Void in
            })
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)
            }
            myDevice.unlockForConfiguration()
        } catch let error {
            print("lock error: \(error)")
        }
   
```
  • Swift

    13984 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

3 コード修正

退会済みユーザー

退会済みユーザー

2017/02/13 20:20  投稿

AVCaptureVideoDataOutputのカメラの露出時間を取得する方法
###前提・実現したいこと
AVFoundationを使い、任意の場所をタッチするとそこに露出が合う
カスタムカメラを作成しました。
その露出時間での撮影と、その露出時間から±1の露出時間での撮影を行いたいです。
そこでカメラ画面をタップしたとき(キャプチャする前)の露光時間を取得したいのですが、やり方がわかりません。
色々調べて、CMSampleBufferGetAudioBufferListWithRetainedBlockBufferという関数を使うのだと出てきましたが、これはキャプチャした後にUIImageからexif情報を読み出すためのものなのでしょうか。  
 
宜しくお願いします。
###該当のソースコード
```Swift3
// タップで露出を合わせる
var adjustingExposure: Bool!
    func focusWithMode(focusMode : AVCaptureFocusMode, exposeWithMode expusureMode :AVCaptureExposureMode, atDevicePoint point:CGPoint, motiorSubjectAreaChange monitorSubjectAreaChange:Bool) {
        DispatchQueue.main.async(execute: {
            let device : AVCaptureDevice = self.myDevice
            do {
                try device.lockForConfiguration()
                if(device.isExposurePointOfInterestSupported && device.isExposureModeSupported(expusureMode)) {
                    self.adjustingExposure = true
                    device.exposurePointOfInterest = point
                    device.exposureMode = expusureMode
                }
                device.isSubjectAreaChangeMonitoringEnabled = monitorSubjectAreaChange
                device.unlockForConfiguration()
            } catch let error as NSError {
                print(error.debugDescription)
            }
        })
    }
    
        func observeValueForKeyPath(keyPath: String, ofObject object: Any, change: [NSKeyValueChangeKey : Any], context: UnsafeMutableRawPointer) {
        if !self.adjustingExposure {
            return
        }
        if keyPath == "adjustingExposure" {
            let isNew = change[NSKeyValueChangeKey.newKey] as! Bool
            if !isNew {
                self.adjustingExposure = false
            }
        }
        let maxISO = myDevice.activeFormat.maxISO
        let minISO = myDevice.activeFormat.minISO
        let currentISO = (maxISO + minISO)/2
        do {
            try myDevice.lockForConfiguration()
            myDevice.exposureMode = AVCaptureExposureMode.locked
            // tapで設定された値で撮影する
            myDevice.setExposureModeCustomWithDuration(AVCaptureExposureDurationCurrent, iso: curentISO, completionHandler: {(time) -> Void in
            })
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)
            }
            myDevice.setExposureModeCustomWithDuration(AVCaptureExposureDurationCurrent, iso: maxISO, completionHandler: {(time) -> Void in
            })
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)
            }
            myDevice.setExposureModeCustomWithDuration(AVCaptureExposureDurationCurrent, iso: minISO, completionHandler: {(time) -> Void in
            })
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)
            }
            myDevice.unlockForConfiguration()
        } catch let error as NSError {
                print(error.debugDescription)
        } catch let error {
            print("lock error: \(error)")
        }
    }
   
```
  • Swift

    13984 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

2

退会済みユーザー

退会済みユーザー

2017/02/10 12:02  投稿

AVCaptureVideoDataOutputのカメラの露出時間を取得する方法
###前提・実現したいこと
AVFoundationを使い、任意の場所をタッチするとそこに露出が合う
カスタムカメラを作成しました。
その露出時間での撮影と、その露出時間から±1の露出時間での撮影を行いたいです。
そこでカメラ画面をタップしたとき(キャプチャする前)の露光時間を取得したいのですが、やり方がわかりません。
色々調べて、CMSampleBufferGetAudioBufferListWithRetainedBlockBufferという関数を使うのだと出てきましたが、これはキャプチャした後にUIImageからexif情報を読み出すためのものなのでしょうか。
宜しくお願いします。
###該当のソースコード
```Swift3
// タップで露出を合わせる
var adjustingExposure: Bool!
    func focusWithMode(focusMode : AVCaptureFocusMode, exposeWithMode expusureMode :AVCaptureExposureMode, atDevicePoint point:CGPoint, motiorSubjectAreaChange monitorSubjectAreaChange:Bool) {
        DispatchQueue.main.async(execute: {
            let device : AVCaptureDevice = self.myDevice
            do {
                try device.lockForConfiguration()
                if(device.isExposurePointOfInterestSupported && device.isExposureModeSupported(expusureMode)) {
                    self.adjustingExposure = true
                    device.exposurePointOfInterest = point
                    device.exposureMode = expusureMode
                }
                device.isSubjectAreaChangeMonitoringEnabled = monitorSubjectAreaChange
                device.unlockForConfiguration()
            } catch let error as NSError {
                print(error.debugDescription)
            }
        })
    }
    
        func observeValueForKeyPath(keyPath: String, ofObject object: Any, change: [NSKeyValueChangeKey : Any], context: UnsafeMutableRawPointer) {
        if !self.adjustingExposure {
            return
        }
        if keyPath == "adjustingExposure" {
            let isNew = change[NSKeyValueChangeKey.newKey] as! Bool
            if !isNew {
                self.adjustingExposure = false
            }
        }
        do {
            try myDevice.lockForConfiguration()
            myDevice.exposureMode = AVCaptureExposureMode.locked
            myDevice.unlockForConfiguration()
        } catch let error as NSError {
                print(error.debugDescription)
        }
    }
// 露出時間  
        let myExposure:Float = //ここに反映させたい  
        let Exposure1 = myExposure * 2  
        let Exposure2 = myExposure / 2  
        do {  
            try myDevice.lockForConfiguration()  
            myDevice.exposureMode = AVCaptureExposureMode.locked  
            // tapで設定された値で撮影  
            myDevice.setExposureTargetBias(myExposure, completionHandler: {(time) -> Void in  
            })  
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {  
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)  
            }  
             print("myExposure: \(myExposure)")  
            // Exposure1  
            myDevice.setExposureTargetBias(Exposure1, completionHandler: {(time) -> Void in  
            })  
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {  
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)  
            }  
             print("Exposure1: \(Exposure1)")  
            // Exposure2で撮影する  
            myDevice.setExposureTargetBias(Exposure2, completionHandler: {(time) -> Void in  
            })  
   
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {  
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)  
            }  
            print("Exposure2: \(Exposure2)")  
            myDevice.unlockForConfiguration()  
        } catch let error {  
            print("lock error: \(error)")  
        }  
 
```
  • Swift

    13984 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1 ためしたこと

退会済みユーザー

退会済みユーザー

2017/02/10 04:57  投稿

AVCaptureVideoDataOutputのカメラの露出時間を取得する方法
###前提・実現したいこと
AVFoundationを使い、任意の場所をタッチするとそこに露出が合う
カスタムカメラを作成しました。
その露出時間での撮影と、その露出時間から±1の露出時間での撮影を行いたいです。
そこでカメラ画面をタップしたとき(キャプチャする前)の露光時間を取得したいのですが、やり方がわかりません。
 
色々調べて、CMSampleBufferGetAudioBufferListWithRetainedBlockBufferという関数を使うのだと出てきましたが、これはキャプチャした後にUIImageからexif情報を読み出すためのものなのでしょうか。  
宜しくお願いします。
###該当のソースコード
```Swift3
// タップで露出を合わせる
var adjustingExposure: Bool!
    func focusWithMode(focusMode : AVCaptureFocusMode, exposeWithMode expusureMode :AVCaptureExposureMode, atDevicePoint point:CGPoint, motiorSubjectAreaChange monitorSubjectAreaChange:Bool) {
        DispatchQueue.main.async(execute: {
            let device : AVCaptureDevice = self.myDevice
            do {
                try device.lockForConfiguration()
                if(device.isExposurePointOfInterestSupported && device.isExposureModeSupported(expusureMode)) {
                    self.adjustingExposure = true
                    device.exposurePointOfInterest = point
                    device.exposureMode = expusureMode
                }
                device.isSubjectAreaChangeMonitoringEnabled = monitorSubjectAreaChange
                device.unlockForConfiguration()
            } catch let error as NSError {
                print(error.debugDescription)
            }
        })
    }
    
        func observeValueForKeyPath(keyPath: String, ofObject object: Any, change: [NSKeyValueChangeKey : Any], context: UnsafeMutableRawPointer) {
        if !self.adjustingExposure {
            return
        }
        if keyPath == "adjustingExposure" {
            let isNew = change[NSKeyValueChangeKey.newKey] as! Bool
            if !isNew {
                self.adjustingExposure = false
            }
        }
        do {
            try myDevice.lockForConfiguration()
            myDevice.exposureMode = AVCaptureExposureMode.locked
            myDevice.unlockForConfiguration()
        } catch let error as NSError {
                print(error.debugDescription)
        }
    }
// 露出時間
        let myExposure:Float = //ここに反映させたい
        let Exposure1 = myExposure * 2
        let Exposure2 = myExposure / 2
        do {
            try myDevice.lockForConfiguration()
            myDevice.exposureMode = AVCaptureExposureMode.locked
            // tapで設定された値で撮影
            myDevice.setExposureTargetBias(myExposure, completionHandler: {(time) -> Void in
            })
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)
            }
             print("myExposure: \(myExposure)")
            // Exposure1
            myDevice.setExposureTargetBias(Exposure1, completionHandler: {(time) -> Void in
            })
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)
            }
             print("Exposure1: \(Exposure1)")
            // Exposure2で撮影する
            myDevice.setExposureTargetBias(Exposure2, completionHandler: {(time) -> Void in
            })
 
            if var _:AVCaptureConnection? = myOutput.connection(withMediaType: AVMediaTypeVideo) {
                UIImageWriteToSavedPhotosAlbum(self.imageView.image!, self, nil, nil)
            }
            print("Exposure2: \(Exposure2)")
            myDevice.unlockForConfiguration()
        } catch let error {
            print("lock error: \(error)")
        }
```
###試したこと
色々調べて、CMSampleBufferGetAudioBufferListWithRetainedBlockBufferという関数を使うのだと出てきましたが、これはキャプチャした後にUIImageからexif情報を読み出すためのものなのでしょうか。
  • Swift

    13984 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る