ios 10 new camera
TRANSCRIPT
![Page 1: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/1.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
iOS 10 new Camera
1
![Page 2: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/2.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
⽬次1. カメラ機能について
2. AVCapturePhotoOutput
3. AVCapturePhotoSettings
4. 実装
5. iPhone7Plus のデュアルカメラ
2
![Page 3: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/3.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
カメラ機能について
3
![Page 4: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/4.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
従来の⽅法
従来iOSで写真撮影といえば
UIImagePickerController
AVFoundation
を使⽤する⽅法の2つが良く使われる
4
![Page 5: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/5.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
従来の⽅法
従来iOSで写真撮影といえば
UIImagePickerController
AVFoundation
を使⽤する⽅法の2つが良く使われる
今回のメインはコレ
5
![Page 6: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/6.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
iOS 10 は?
iOS 10 では AVFoundation の中の AVCaptureStillImageOutput が deprecated になった
そのため別な⽅法として AVCapturePhotoOutput を使⽤する
6
![Page 7: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/7.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
AVCapturePhotoOutput
7
![Page 8: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/8.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
AVCapturePhotoOutput とは
静⽌画撮影をサポートする
AVCaptureOutput のサブクラス
AVCaptureStillImageOutput の代わりとして使⽤
様々なインターフェースが実装されている
使⽤可能なのは iOS 10 から
8
![Page 9: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/9.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
撮影
AVCapturePhotoOutput の capturePhoto
呼ぶ際にデータを作成するための設定を渡す
AVCapturePhotoSettings
AVCapturePhotoCaptureDelegate
9
![Page 10: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/10.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
撮影
AVCapturePhotoOutput の capturePhoto
呼ぶ際にデータを作成するための設定を渡す
AVCapturePhotoSettings
AVCapturePhotoCaptureDelegate
画像効果等の設定
10
![Page 11: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/11.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
撮影
AVCapturePhotoOutput の capturePhoto
呼ぶ際にデータを作成するための設定を渡す
AVCapturePhotoSettings
AVCapturePhotoCaptureDelegate
画像効果等の設定
結果の返ってくる Delegate
11
![Page 12: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/12.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
AVCapturePhotoSettings
12
![Page 13: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/13.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
AVCapturePhotoSettings とは
写真のキャプチャに関する設定を記述する
画像に対しての効果などもここに記述
フラッシュのモード
ハイレゾの使⽤
13
![Page 14: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/14.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
AVCapturePhotoSettings とは
このインスタンスは使い回しができない
使い回しをしようとすると例外が発⽣
再利⽤するためのメソッドが⽤意してある
init(from:) に使い回したい settings を渡す
14
![Page 15: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/15.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
実装
15
![Page 16: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/16.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
AVCaptureSession の設定基本的なコードは従来と変わらない
session = AVCaptureSession() session?.sessionPreset = AVCaptureSessionPresetPhoto videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) guard let _videoPreviewLayer = videoPreviewLayer else {return} _videoPreviewLayer.frame = self.view.frame _videoPreviewLayer.masksToBounds = true _videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(_videoPreviewLayer) let device = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) let input = try! AVCaptureDeviceInput(device: device) session?.addInput(input) photoOutput = AVCapturePhotoOutput() session?.addOutput(photoOutput) session?.startRunning()
16
![Page 17: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/17.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
AVCaptureSession の設定基本的なコードは従来と変わらない
session = AVCaptureSession() session?.sessionPreset = AVCaptureSessionPresetPhoto videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) guard let _videoPreviewLayer = videoPreviewLayer else {return} _videoPreviewLayer.frame = self.view.frame _videoPreviewLayer.masksToBounds = true _videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(_videoPreviewLayer) let device = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) let input = try! AVCaptureDeviceInput(device: device) session?.addInput(input) photoOutput = AVCapturePhotoOutput() session?.addOutput(photoOutput) session?.startRunning()
AVCapture Session の設定
17
![Page 18: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/18.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
AVCaptureSession の設定基本的なコードは従来と変わらない
session = AVCaptureSession() session?.sessionPreset = AVCaptureSessionPresetPhoto videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) guard let _videoPreviewLayer = videoPreviewLayer else {return} _videoPreviewLayer.frame = self.view.frame _videoPreviewLayer.masksToBounds = true _videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(_videoPreviewLayer) let device = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) let input = try! AVCaptureDeviceInput(device: device) session?.addInput(input) photoOutput = AVCapturePhotoOutput() session?.addOutput(photoOutput) session?.startRunning()
AVCapture Session の設定
プレビューを表⽰する⽤のレイヤー作成
18
![Page 19: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/19.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
AVCaptureSession の設定基本的なコードは従来と変わらない
session = AVCaptureSession() session?.sessionPreset = AVCaptureSessionPresetPhoto videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) guard let _videoPreviewLayer = videoPreviewLayer else {return} _videoPreviewLayer.frame = self.view.frame _videoPreviewLayer.masksToBounds = true _videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(_videoPreviewLayer) let device = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) let input = try! AVCaptureDeviceInput(device: device) session?.addInput(input) photoOutput = AVCapturePhotoOutput() session?.addOutput(photoOutput) session?.startRunning()
AVCapture Session の設定
プレビューを表⽰する⽤のレイヤー作成
デバイスの設定
19
![Page 20: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/20.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
AVCaptureSession の設定基本的なコードは従来と変わらない
session = AVCaptureSession() session?.sessionPreset = AVCaptureSessionPresetPhoto videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) guard let _videoPreviewLayer = videoPreviewLayer else {return} _videoPreviewLayer.frame = self.view.frame _videoPreviewLayer.masksToBounds = true _videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill self.view.layer.addSublayer(_videoPreviewLayer) let device = AVCaptureDevice.defaultDevice(withDeviceType: AVCaptureDeviceType.builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) let input = try! AVCaptureDeviceInput(device: device) session?.addInput(input) photoOutput = AVCapturePhotoOutput() session?.addOutput(photoOutput) session?.startRunning()
実際に変わるのはここ!
20
![Page 21: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/21.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
コード func takePicture(){ let settingsForMonitoring = AVCapturePhotoSettings() settingsForMonitoring.flashMode = .auto settingsForMonitoring.isAutoStillImageStabilizationEnabled = true settingsForMonitoring.isHighResolutionPhotoEnabled = false // settings と delegate を渡す photoOutput?.capturePhoto(with: settingsForMonitoring, delegate: self) }
extension ViewController:AVCapturePhotoCaptureDelegate{ func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { /* ~~ ここでデータを保存したり画像の加⼯を⾏う ~~*/ } }
21
![Page 22: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/22.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
コード func takePicture(){ let settingsForMonitoring = AVCapturePhotoSettings() settingsForMonitoring.flashMode = .auto settingsForMonitoring.isAutoStillImageStabilizationEnabled = true settingsForMonitoring.isHighResolutionPhotoEnabled = false // settings と delegate を渡す photoOutput?.capturePhoto(with: settingsForMonitoring, delegate: self) }
extension ViewController:AVCapturePhotoCaptureDelegate{ func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { /* ~~ ここでデータを保存したり画像の加⼯を⾏う ~~*/ } }
ここでAVCapturePhotoSettingsを設定している
22
![Page 23: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/23.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
iPhone 7 Plus の デュアルカメラ
23
![Page 24: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/24.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
デュアルカメラ
• iPhone 7 plus には背⾯に 2 つのカメラがついてる
• カメラアプリでそれらを指定して使⽤することが出来るのかどうか確認した
24
![Page 25: iOS 10 new Camera](https://reader031.vdocuments.net/reader031/viewer/2022021503/586f91711a28ab54768b7c59/html5/thumbnails/25.jpg)
Copyright © Up-frontier, Inc. All rights reserved.
⽚⽅のカメラの指定AVCaptureDevice.defaultDevice(withDeviceType: mediaType: position:)
上記メソッドの withDeviceType に設定
builtInWideAngleCamera : 左カメラ
builtInTelephotoCamera : 右カメラ
指定しない版のメソッドなら左カメラ
25