iOSプログラミング with Swift 2


2016.05.29: created by

SwiftでCamera を使う(AVFoundation 経由)

UIImagePickerController 経由でカメラや写真アルバムにアクセスすることができますが、 もっと柔軟にカメラを利用するには AVFoundation フレームワークを使います。

  1. Xcode を起動して "Create a new Xcode project" で "Single View Application" として新しいプロジェクトを開きます。 ここではプロジェクト名を SwiftAVF としています。



  2. プロジェクトの最初に表示される画面は、ウィンドウの左側に表示されている "Show the project navigator" アイコンをクリックしても表示されます。 "General" -> "Linked Frameworks and Libraries" ->"+"ボタン を押して Add で AVFoundation.framework を追加します。









  3. Main.storyboard 上に Button を配置し、表示を"Photo"に変えておきます。 さらにImage Viewを配置します。



  4. Button は Action (Touch Up Inside) で "tapPhoto" 関数と connectし、 Image View は Outlet で "myImageView" 変数とconnect します。



  5. ViewController.swift を変更します。
  6. ViewController.swiftに追加するコード(赤字部分)
    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
        @IBOutlet weak var myImageView: UIImageView!
    
        var myImageOutput: AVCaptureStillImageOutput!
        
        @IBAction func tapPhoto(sender: AnyObject) {
            let myAVConnection = myImageOutput.connectionWithMediaType(AVMediaTypeVideo)
            myImageOutput.captureStillImageAsynchronouslyFromConnection(myAVConnection, completionHandler: {
                (imageDataBuffer,error) -> Void in
                let myImageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataBuffer)
                self.myImageView.image = UIImage(data: myImageData)
            })
        }
        
        func startVideo() {
            let mySession = AVCaptureSession()
            mySession.sessionPreset = AVCaptureSessionPresetHigh
            var myCamera: AVCaptureDevice!
            let devices = AVCaptureDevice.devices()
            for device in devices {
                if (device.position == AVCaptureDevicePosition.Back) {
                    myCamera = device as! AVCaptureDevice
                }
            }
            do {
                let videoInput = try AVCaptureDeviceInput(device: myCamera)
                mySession.addInput(videoInput)
                myImageOutput = AVCaptureStillImageOutput()
                mySession.addOutput(myImageOutput)
                let myVideoLayer = AVCaptureVideoPreviewLayer(session: mySession)
                myVideoLayer.frame = view.bounds
                myVideoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
                view.layer.insertSublayer(myVideoLayer,atIndex:0)
                mySession.startRunning()
            } catch let error as NSError {
                print("cannot use camera \(error)")
            }
        }
     
        override func viewDidLoad() {
            super.viewDidLoad()
            startVideo()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
    }
    
  7. 実行すると、カメラへのアクセス許可を求めてきます。 許可すると背景にビデオカメラの画像がリアルタイムで表示され、Photoボタンを押すと その時点の写真が ImageView に表示されます。
        

  8. サンプルのプロジェクトはこちら。(Xcode 7.3.1版)


http://karel.tsuda.ac.jp