しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

AVFoundationでカメラの映像をUIImageにする

AVFoundationを使ってカメラに写った映像をUIImageにする方法を調べてみました。
参考にしたサイトは下のものです。

002 カメラの起動と画像の保存 - Swift Docs

AVFoundationとは

公式ドキュメントによると「時間ベースのオーディオビジュアルメディアの再生と作成に使用できるフレームワーク」との事です。
要するに動画関連のフレームワークで、動画の再生・作成・編集などができるみたいです。

https://developer.apple.com/jp/documentation/AVFoundationPG.pdf

カメラを起動する

カメラ起動の方法は下の通りです。

セッションに入力・出力をセットする事でキャプチャーを開始します。
カメラの画像を見るためにはAVCaptureVideoPreviewLayerを使っています。

今回はカメラからの入力をUIImageにする事をしていますが、入力をマイクに変えたり出力をファイルにする事もできるようです。

import AVFoundation

// Inputを作成
var audioInput: AVCaptureInput?
let device = AVCaptureDevice.devices().filter { $0.position == .Back }.first as! AVCaptureDevice?
do {
    audioInput = try AVCaptureDeviceInput(device: device)
} catch {}

// Outputを作成
let imageOutput = AVCaptureStillImageOutput()

// セッションを作成と起動
let session = AVCaptureSession()
session.addInput(audioInput!)
session.addOutput(imageOutput)
session.startRunning()

// カメラの映像を画面に表示する為のレイヤー作成
let myVideoLayer = AVCaptureVideoPreviewLayer(session: session)
myVideoLayer.frame = self.view.bounds
myVideoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
view.layer.addSublayer(myVideoLayer)

画像を出力する

画像をUIImageにする処理は以下の通りです。

let connection = imageOutput.connectionWithMediaType(AVMediaTypeVideo)
imageOutput.captureStillImageAsynchronouslyFromConnection(connection, completionHandler: { (imageDataBuffer, error) -> Void in
    // 画像をNSDataとして取得
    let myImageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataBuffer)
    _ = UIImage(data: myImageData)!
})