SlideShare a Scribd company logo
1 of 25
Download to read offline
Copyright © Up-frontier, Inc. All rights reserved.
iOS 10 new Camera
1
Copyright © Up-frontier, Inc. All rights reserved.
⽬次
1. カメラ機能について
2. AVCapturePhotoOutput
3. AVCapturePhotoSettings
4. 実装
5. iPhone7Plus のデュアルカメラ
2
Copyright © Up-frontier, Inc. All rights reserved.
カメラ機能について
3
Copyright © Up-frontier, Inc. All rights reserved.
従来の⽅法
従来	iOS	で写真撮影といえば	
UIImagePickerController
AVFoundation
を使⽤する⽅法の2つが良く使われる
4
Copyright © Up-frontier, Inc. All rights reserved.
従来の⽅法
従来	iOS	で写真撮影といえば	
UIImagePickerController
AVFoundation
を使⽤する⽅法の2つが良く使われる
今回のメインはコレ
5
Copyright © Up-frontier, Inc. All rights reserved.
iOS 10 は?
iOS 10 では AVFoundation の中の
AVCaptureStillImageOutput が deprecated に
なった
そのため別な⽅法として AVCapturePhotoOutput
を使⽤する
6
Copyright © Up-frontier, Inc. All rights reserved.
AVCapturePhotoOutput
7
Copyright © Up-frontier, Inc. All rights reserved.
AVCapturePhotoOutput とは
静⽌画撮影をサポートする
AVCaptureOutput のサブクラス
AVCaptureStillImageOutput の代わりとして使⽤
様々なインターフェースが実装されている
使⽤可能なのは iOS 10 から
8
Copyright © Up-frontier, Inc. All rights reserved.
撮影
AVCapturePhotoOutput の capturePhoto
呼ぶ際にデータを作成するための設定を渡す
AVCapturePhotoSettings
AVCapturePhotoCaptureDelegate
9
Copyright © Up-frontier, Inc. All rights reserved.
撮影
AVCapturePhotoOutput の capturePhoto
呼ぶ際にデータを作成するための設定を渡す
AVCapturePhotoSettings
AVCapturePhotoCaptureDelegate
画像効果等の設定
10
Copyright © Up-frontier, Inc. All rights reserved.
撮影
AVCapturePhotoOutput の capturePhoto
呼ぶ際にデータを作成するための設定を渡す
AVCapturePhotoSettings
AVCapturePhotoCaptureDelegate
画像効果等の設定
結果の返ってくる Delegate
11
Copyright © Up-frontier, Inc. All rights reserved.
AVCapturePhotoSettings
12
Copyright © Up-frontier, Inc. All rights reserved.
AVCapturePhotoSettings とは
写真のキャプチャに関する設定を記述する
画像に対しての効果などもここに記述
フラッシュのモード
ハイレゾの使⽤
13
Copyright © Up-frontier, Inc. All rights reserved.
AVCapturePhotoSettings とは
このインスタンスは使い回しができない
使い回しをしようとすると例外が発⽣
再利⽤するためのメソッドが⽤意してある
init(from:) に使い回したい settings を渡す
14
Copyright © Up-frontier, Inc. All rights reserved.
実装
15
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
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
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
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
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
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
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
Copyright © Up-frontier, Inc. All rights reserved.
iPhone 7 Plus の
デュアルカメラ
23
Copyright © Up-frontier, Inc. All rights reserved.
デュアルカメラ
• iPhone 7 plus には背⾯に 2 つのカメラがついて
る
• カメラアプリでそれらを指定して使⽤することが出
来るのかどうか確認した
24
Copyright © Up-frontier, Inc. All rights reserved.
⽚⽅のカメラの指定
AVCaptureDevice.defaultDevice(withDeviceType: mediaType: position:)
上記メソッドの withDeviceType に設定
builtInWideAngleCamera : 左カメラ
builtInTelephotoCamera : 右カメラ
指定しない版のメソッドなら左カメラ
25

More Related Content

What's hot

NEDO特別講座_画像処理・AI技術活用コース_後編
NEDO特別講座_画像処理・AI技術活用コース_後編NEDO特別講座_画像処理・AI技術活用コース_後編
NEDO特別講座_画像処理・AI技術活用コース_後編NEDOROBOMARC
 
Game Creators Conference 2019 Koichi Miura
Game Creators Conference 2019 Koichi MiuraGame Creators Conference 2019 Koichi Miura
Game Creators Conference 2019 Koichi MiuraKoichi Miura
 
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記心 谷本
 
Game Creators Conference 2019 Keiji Kikuchi
Game Creators Conference 2019 Keiji KikuchiGame Creators Conference 2019 Keiji Kikuchi
Game Creators Conference 2019 Keiji KikuchiKeiji Kikuchi
 
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡心 谷本
 
3Dロボットビジョンプラットフォーム「RoVI」入門
3Dロボットビジョンプラットフォーム「RoVI」入門3Dロボットビジョンプラットフォーム「RoVI」入門
3Dロボットビジョンプラットフォーム「RoVI」入門NEDOROBOMARC
 

What's hot (11)

NEDO特別講座_画像処理・AI技術活用コース_後編
NEDO特別講座_画像処理・AI技術活用コース_後編NEDO特別講座_画像処理・AI技術活用コース_後編
NEDO特別講座_画像処理・AI技術活用コース_後編
 
UE4を用いたTPS制作事例 EDF:IR レベル構成について
UE4を用いたTPS制作事例 EDF:IR レベル構成についてUE4を用いたTPS制作事例 EDF:IR レベル構成について
UE4を用いたTPS制作事例 EDF:IR レベル構成について
 
UE4における大規模レベル実装ワークフローとブループリント活用事例
UE4における大規模レベル実装ワークフローとブループリント活用事例UE4における大規模レベル実装ワークフローとブループリント活用事例
UE4における大規模レベル実装ワークフローとブループリント活用事例
 
UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の歩き方
UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の歩き方UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の歩き方
UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の歩き方
 
Game Creators Conference 2019 Koichi Miura
Game Creators Conference 2019 Koichi MiuraGame Creators Conference 2019 Koichi Miura
Game Creators Conference 2019 Koichi Miura
 
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
 
UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の作り方
UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の作り方UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の作り方
UE4を用いたTPS制作事例 EDF:IR 地球を衛る兵士の作り方
 
Game Creators Conference 2019 Keiji Kikuchi
Game Creators Conference 2019 Keiji KikuchiGame Creators Conference 2019 Keiji Kikuchi
Game Creators Conference 2019 Keiji Kikuchi
 
UE4におけるエフェクトの基本戦略事例 後半
UE4におけるエフェクトの基本戦略事例  後半UE4におけるエフェクトの基本戦略事例  後半
UE4におけるエフェクトの基本戦略事例 後半
 
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
 
3Dロボットビジョンプラットフォーム「RoVI」入門
3Dロボットビジョンプラットフォーム「RoVI」入門3Dロボットビジョンプラットフォーム「RoVI」入門
3Dロボットビジョンプラットフォーム「RoVI」入門
 

Similar to iOS 10 new Camera

Swiftではじめる動画再生
Swiftではじめる動画再生Swiftではじめる動画再生
Swiftではじめる動画再生Yusuke Ariyoshi
 
iOSで動画からスクショを撮る方法
iOSで動画からスクショを撮る方法iOSで動画からスクショを撮る方法
iOSで動画からスクショを撮る方法Tomo Ita
 
UIImagePickerController よもやま話
UIImagePickerController よもやま話UIImagePickerController よもやま話
UIImagePickerController よもやま話Kei Kusakari
 
I phonedevws20121028ci filter
I phonedevws20121028ci filterI phonedevws20121028ci filter
I phonedevws20121028ci filterZuQ9Nn
 
Android4.2徹底解剖!
Android4.2徹底解剖!Android4.2徹底解剖!
Android4.2徹底解剖!leverages_event
 
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 EastiOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 Eastirgaly
 
HTML5 APIを使ったデモとソースの解説
HTML5 APIを使ったデモとソースの解説HTML5 APIを使ったデモとソースの解説
HTML5 APIを使ったデモとソースの解説Hideki Akiba
 
Android sdk manual_1.02
Android sdk manual_1.02Android sdk manual_1.02
Android sdk manual_1.02Tomohiro Kondo
 
Android sdk manual_1.02
Android sdk manual_1.02Android sdk manual_1.02
Android sdk manual_1.02Tomohiro Kondo
 
ビジュアルスクリプティングシステムBoltを使ってみよう 2回目
ビジュアルスクリプティングシステムBoltを使ってみよう 2回目ビジュアルスクリプティングシステムBoltを使ってみよう 2回目
ビジュアルスクリプティングシステムBoltを使ってみよう 2回目Unity Technologies Japan K.K.
 
6秒動画アプリ Vineの作り方
6秒動画アプリ Vineの作り方6秒動画アプリ Vineの作り方
6秒動画アプリ Vineの作り方Hiramatsu Ryosuke
 
SIerによるSIerのためのRaspberry Pi 入門4 (タイムラプス、Lチカ)
SIerによるSIerのためのRaspberry Pi 入門4 (タイムラプス、Lチカ)SIerによるSIerのためのRaspberry Pi 入門4 (タイムラプス、Lチカ)
SIerによるSIerのためのRaspberry Pi 入門4 (タイムラプス、Lチカ)catmoney
 
商用ミドルウェアのPuppet化で気を付けたい5つのこと
商用ミドルウェアのPuppet化で気を付けたい5つのこと商用ミドルウェアのPuppet化で気を付けたい5つのこと
商用ミドルウェアのPuppet化で気を付けたい5つのことNTT DATA OSS Professional Services
 
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料][G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]Trainocate Japan, Ltd.
 
[iOS 8] iOS8勉強会 PhotoKit
[iOS 8] iOS8勉強会 PhotoKit[iOS 8] iOS8勉強会 PhotoKit
[iOS 8] iOS8勉強会 PhotoKitShingo Hiraya
 
AppStoreのアプリ動画App Previewsの作り方
AppStoreのアプリ動画App Previewsの作り方AppStoreのアプリ動画App Previewsの作り方
AppStoreのアプリ動画App Previewsの作り方Kosuke Ogawa
 

Similar to iOS 10 new Camera (20)

Swiftではじめる動画再生
Swiftではじめる動画再生Swiftではじめる動画再生
Swiftではじめる動画再生
 
iOSで動画からスクショを撮る方法
iOSで動画からスクショを撮る方法iOSで動画からスクショを撮る方法
iOSで動画からスクショを撮る方法
 
Android Hacks - Hack30
Android Hacks - Hack30Android Hacks - Hack30
Android Hacks - Hack30
 
UIImagePickerController よもやま話
UIImagePickerController よもやま話UIImagePickerController よもやま話
UIImagePickerController よもやま話
 
Workspace ONE Windows 10 Management PoC Guide
Workspace ONE Windows 10 Management PoC GuideWorkspace ONE Windows 10 Management PoC Guide
Workspace ONE Windows 10 Management PoC Guide
 
I phonedevws20121028ci filter
I phonedevws20121028ci filterI phonedevws20121028ci filter
I phonedevws20121028ci filter
 
Android4.2徹底解剖!
Android4.2徹底解剖!Android4.2徹底解剖!
Android4.2徹底解剖!
 
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 EastiOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
 
HTML5 APIを使ったデモとソースの解説
HTML5 APIを使ったデモとソースの解説HTML5 APIを使ったデモとソースの解説
HTML5 APIを使ったデモとソースの解説
 
Android sdk manual_1.02
Android sdk manual_1.02Android sdk manual_1.02
Android sdk manual_1.02
 
Android sdk manual_1.02
Android sdk manual_1.02Android sdk manual_1.02
Android sdk manual_1.02
 
ビジュアルスクリプティングシステムBoltを使ってみよう 2回目
ビジュアルスクリプティングシステムBoltを使ってみよう 2回目ビジュアルスクリプティングシステムBoltを使ってみよう 2回目
ビジュアルスクリプティングシステムBoltを使ってみよう 2回目
 
6秒動画アプリ Vineの作り方
6秒動画アプリ Vineの作り方6秒動画アプリ Vineの作り方
6秒動画アプリ Vineの作り方
 
SIerによるSIerのためのRaspberry Pi 入門4 (タイムラプス、Lチカ)
SIerによるSIerのためのRaspberry Pi 入門4 (タイムラプス、Lチカ)SIerによるSIerのためのRaspberry Pi 入門4 (タイムラプス、Lチカ)
SIerによるSIerのためのRaspberry Pi 入門4 (タイムラプス、Lチカ)
 
animation1.0
animation1.0animation1.0
animation1.0
 
【Alfresco勉強会】インストール手順書(windows azure)
【Alfresco勉強会】インストール手順書(windows azure)【Alfresco勉強会】インストール手順書(windows azure)
【Alfresco勉強会】インストール手順書(windows azure)
 
商用ミドルウェアのPuppet化で気を付けたい5つのこと
商用ミドルウェアのPuppet化で気を付けたい5つのこと商用ミドルウェアのPuppet化で気を付けたい5つのこと
商用ミドルウェアのPuppet化で気を付けたい5つのこと
 
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料][G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
 
[iOS 8] iOS8勉強会 PhotoKit
[iOS 8] iOS8勉強会 PhotoKit[iOS 8] iOS8勉強会 PhotoKit
[iOS 8] iOS8勉強会 PhotoKit
 
AppStoreのアプリ動画App Previewsの作り方
AppStoreのアプリ動画App Previewsの作り方AppStoreのアプリ動画App Previewsの作り方
AppStoreのアプリ動画App Previewsの作り方
 

More from Gaprot

AR開発高速化!「CFA」作りました!
AR開発高速化!「CFA」作りました!AR開発高速化!「CFA」作りました!
AR開発高速化!「CFA」作りました!Gaprot
 
Unity + iOS/Android VR ことはじめ
Unity + iOS/Android VR ことはじめUnity + iOS/Android VR ことはじめ
Unity + iOS/Android VR ことはじめGaprot
 
1201 ギャップロ軍団企画書
1201 ギャップロ軍団企画書1201 ギャップロ軍団企画書
1201 ギャップロ軍団企画書Gaprot
 
Speech Framework
Speech FrameworkSpeech Framework
Speech FrameworkGaprot
 
SiriKit iOS10
SiriKit iOS10SiriKit iOS10
SiriKit iOS10Gaprot
 
Proactive Suggestions
Proactive SuggestionsProactive Suggestions
Proactive SuggestionsGaprot
 
New Notification API in iOS 10
New Notification API in iOS 10New Notification API in iOS 10
New Notification API in iOS 10Gaprot
 
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させる
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させるHTML5 + JavaScriptでDRMつきMPEG-DASHを再生させる
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させるGaprot
 
Aiマッシュアップ委員会 仕様説明資料
Aiマッシュアップ委員会 仕様説明資料Aiマッシュアップ委員会 仕様説明資料
Aiマッシュアップ委員会 仕様説明資料Gaprot
 
GoF のデザインパターンじゃないけど、よくあるパターン
GoF のデザインパターンじゃないけど、よくあるパターンGoF のデザインパターンじゃないけど、よくあるパターン
GoF のデザインパターンじゃないけど、よくあるパターンGaprot
 
Java の Collection 関連について整理してみました
Java の Collection 関連について整理してみましたJava の Collection 関連について整理してみました
Java の Collection 関連について整理してみましたGaprot
 
Salmon Hunt
Salmon HuntSalmon Hunt
Salmon HuntGaprot
 
SONY Camera Remote API
SONY Camera Remote APISONY Camera Remote API
SONY Camera Remote APIGaprot
 
「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!Gaprot
 

More from Gaprot (14)

AR開発高速化!「CFA」作りました!
AR開発高速化!「CFA」作りました!AR開発高速化!「CFA」作りました!
AR開発高速化!「CFA」作りました!
 
Unity + iOS/Android VR ことはじめ
Unity + iOS/Android VR ことはじめUnity + iOS/Android VR ことはじめ
Unity + iOS/Android VR ことはじめ
 
1201 ギャップロ軍団企画書
1201 ギャップロ軍団企画書1201 ギャップロ軍団企画書
1201 ギャップロ軍団企画書
 
Speech Framework
Speech FrameworkSpeech Framework
Speech Framework
 
SiriKit iOS10
SiriKit iOS10SiriKit iOS10
SiriKit iOS10
 
Proactive Suggestions
Proactive SuggestionsProactive Suggestions
Proactive Suggestions
 
New Notification API in iOS 10
New Notification API in iOS 10New Notification API in iOS 10
New Notification API in iOS 10
 
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させる
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させるHTML5 + JavaScriptでDRMつきMPEG-DASHを再生させる
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させる
 
Aiマッシュアップ委員会 仕様説明資料
Aiマッシュアップ委員会 仕様説明資料Aiマッシュアップ委員会 仕様説明資料
Aiマッシュアップ委員会 仕様説明資料
 
GoF のデザインパターンじゃないけど、よくあるパターン
GoF のデザインパターンじゃないけど、よくあるパターンGoF のデザインパターンじゃないけど、よくあるパターン
GoF のデザインパターンじゃないけど、よくあるパターン
 
Java の Collection 関連について整理してみました
Java の Collection 関連について整理してみましたJava の Collection 関連について整理してみました
Java の Collection 関連について整理してみました
 
Salmon Hunt
Salmon HuntSalmon Hunt
Salmon Hunt
 
SONY Camera Remote API
SONY Camera Remote APISONY Camera Remote API
SONY Camera Remote API
 
「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!
 

iOS 10 new Camera

  • 1. Copyright © Up-frontier, Inc. All rights reserved. iOS 10 new Camera 1
  • 2. Copyright © Up-frontier, Inc. All rights reserved. ⽬次 1. カメラ機能について 2. AVCapturePhotoOutput 3. AVCapturePhotoSettings 4. 実装 5. iPhone7Plus のデュアルカメラ 2
  • 3. Copyright © Up-frontier, Inc. All rights reserved. カメラ機能について 3
  • 4. Copyright © Up-frontier, Inc. All rights reserved. 従来の⽅法 従来 iOS で写真撮影といえば UIImagePickerController AVFoundation を使⽤する⽅法の2つが良く使われる 4
  • 5. Copyright © Up-frontier, Inc. All rights reserved. 従来の⽅法 従来 iOS で写真撮影といえば UIImagePickerController AVFoundation を使⽤する⽅法の2つが良く使われる 今回のメインはコレ 5
  • 6. Copyright © Up-frontier, Inc. All rights reserved. iOS 10 は? iOS 10 では AVFoundation の中の AVCaptureStillImageOutput が deprecated に なった そのため別な⽅法として AVCapturePhotoOutput を使⽤する 6
  • 7. Copyright © Up-frontier, Inc. All rights reserved. AVCapturePhotoOutput 7
  • 8. Copyright © Up-frontier, Inc. All rights reserved. AVCapturePhotoOutput とは 静⽌画撮影をサポートする AVCaptureOutput のサブクラス AVCaptureStillImageOutput の代わりとして使⽤ 様々なインターフェースが実装されている 使⽤可能なのは iOS 10 から 8
  • 9. Copyright © Up-frontier, Inc. All rights reserved. 撮影 AVCapturePhotoOutput の capturePhoto 呼ぶ際にデータを作成するための設定を渡す AVCapturePhotoSettings AVCapturePhotoCaptureDelegate 9
  • 10. Copyright © Up-frontier, Inc. All rights reserved. 撮影 AVCapturePhotoOutput の capturePhoto 呼ぶ際にデータを作成するための設定を渡す AVCapturePhotoSettings AVCapturePhotoCaptureDelegate 画像効果等の設定 10
  • 11. Copyright © Up-frontier, Inc. All rights reserved. 撮影 AVCapturePhotoOutput の capturePhoto 呼ぶ際にデータを作成するための設定を渡す AVCapturePhotoSettings AVCapturePhotoCaptureDelegate 画像効果等の設定 結果の返ってくる Delegate 11
  • 12. Copyright © Up-frontier, Inc. All rights reserved. AVCapturePhotoSettings 12
  • 13. Copyright © Up-frontier, Inc. All rights reserved. AVCapturePhotoSettings とは 写真のキャプチャに関する設定を記述する 画像に対しての効果などもここに記述 フラッシュのモード ハイレゾの使⽤ 13
  • 14. Copyright © Up-frontier, Inc. All rights reserved. AVCapturePhotoSettings とは このインスタンスは使い回しができない 使い回しをしようとすると例外が発⽣ 再利⽤するためのメソッドが⽤意してある init(from:) に使い回したい settings を渡す 14
  • 15. Copyright © Up-frontier, Inc. All rights reserved. 実装 15
  • 16. 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
  • 17. 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
  • 18. 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
  • 19. 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
  • 20. 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
  • 21. 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
  • 22. 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
  • 23. Copyright © Up-frontier, Inc. All rights reserved. iPhone 7 Plus の デュアルカメラ 23
  • 24. Copyright © Up-frontier, Inc. All rights reserved. デュアルカメラ • iPhone 7 plus には背⾯に 2 つのカメラがついて る • カメラアプリでそれらを指定して使⽤することが出 来るのかどうか確認した 24
  • 25. Copyright © Up-frontier, Inc. All rights reserved. ⽚⽅のカメラの指定 AVCaptureDevice.defaultDevice(withDeviceType: mediaType: position:) 上記メソッドの withDeviceType に設定 builtInWideAngleCamera : 左カメラ builtInTelephotoCamera : 右カメラ 指定しない版のメソッドなら左カメラ 25