2016-10-20 68 views
11

Oglądałem ten film wideo, aby utworzyć niestandardowy widok z kamery. https://www.youtube.com/watch?v=w0O3ZGUS3pkSwift 3 - Widok niestandardowej kamery AVCapture

jednak ze względu na iOS 10 i Swift 3 Zmiany wiele rzeczy nie były istotne już

następujące jest kod wyszedłem po zmianie funkcji przestarzałej do nowego ones..however nie ma błędu, ale też nie widząc podgląd na UIView

import UIKit 
import AVFoundation 

class ViewController: UIViewController, AVCapturePhotoCaptureDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    @IBOutlet weak var cameraView: UIView! 
    var captureSession = AVCaptureSession(); 
    var sessionOutput = AVCapturePhotoOutput(); 
    var sessionOutputSetting = AVCapturePhotoSettings(format: [AVVideoCodecKey:AVVideoCodecJPEG]); 
    var previewLayer = AVCaptureVideoPreviewLayer(); 

    override func viewWillAppear(_ animated: Bool) { 
     let deviceDiscoverySession = AVCaptureDeviceDiscoverySession(deviceTypes: [AVCaptureDeviceType.builtInDuoCamera, AVCaptureDeviceType.builtInTelephotoCamera,AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.unspecified) 
     for device in (deviceDiscoverySession?.devices)! { 
      if(device.position == AVCaptureDevicePosition.front){ 
       do{ 
        let input = try AVCaptureDeviceInput(device: device) 
        if(captureSession.canAddInput(input)){ 
         captureSession.addInput(input); 

         if(captureSession.canAddOutput(sessionOutput)){ 
          captureSession.addOutput(sessionOutput); 
          previewLayer = AVCaptureVideoPreviewLayer(session: captureSession); 
          previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
          previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait; 
          cameraView.layer.addSublayer(previewLayer); 
         } 
        } 
       } 
       catch{ 
        print("exception!"); 
       } 
      } 
     } 
    } 

Odpowiedz

15

zapomniałeś rozpocząć sesję:

captureSession.startRunning() 

i ustawić ramki dla previewLayer:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    previewLayer.frame = cameraView.bounds 
} 

PS: Po dodaniu wejść i wyjść sesji, powinieneś wyrwać się z tej pętli.

+0

Czy powinien jednak uruchomić jeden raz niezależnie? –

+1

Prawdopodobnie, ale denerwuje mnie –

+1

Na przykład, czy nie ma dwóch aparatów skierowanych tyłem do iPhone'a 7+? Jest to mało prawdopodobne, ale możesz mieć nieprzyjemną niespodziankę na przyszłym sprzęcie ... –