2017-09-30 99 views
4

在iPad的Swift Playground應用程序的最新更新說明中,我看到可通過操場訪問攝像頭。 爲了測試目的,我創建了一個操場來訪問我的iPad後視攝像頭。 作爲參考我用這些來源:Swift Playground iPad攝像頭訪問

這裏是我的代碼:

import UIKit 
import AVFoundation 
import PlaygroundSupport 

class MainViewController : UIViewController { 
    private var _session: AVCaptureSession? 
    private var _captureInput: AVCaptureInput? 
    private var _stillImageOutput: AVCaptureStillImageOutput? 
    private var _frontCamera: AVCaptureDevice? 
    private var _previewView: UIView? 
    private var _previewLayer: AVCaptureVideoPreviewLayer? 

public override func loadView() { 
    print("loadView()") 

    _previewView = UIView() 
    guard let view = _previewView else { 
     printError(errMsg: "View could not be created!") 
     return 
    } 
    view.backgroundColor = UIColor.brown 
    self.view = view 
} 

public override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    // Create a capture session 
    _session = AVCaptureSession() 
    guard let session = _session else { 
     printError(errMsg: "Session is empty!") 
     return 
    } 
    session.beginConfiguration() 
    session.sessionPreset = AVCaptureSession.Preset.photo 

    // Get access to front camera 
    _frontCamera = AVCaptureDevice.default(for: AVMediaType.video) 

    guard let frontCamera = _frontCamera 
     else { 
      printError(errMsg: "Front camera not accessible!") 
      return 
    } 

    do{ 
     _captureInput = try AVCaptureDeviceInput(device: frontCamera) 
    } catch let err as NSError { 
     printError(errMsg: err.localizedDescription) 
     return 
    } 

    // Add input to session 
    guard let captureInput = _captureInput else { 
     printError(errMsg: "Capture input not available!") 
     return 
    } 

    if session.canAddInput(captureInput){ 
     session.addInput(captureInput) 
    } 

    // Configurw the image output 
    _stillImageOutput = AVCaptureStillImageOutput() 
    guard let sillImageOutput = _stillImageOutput else { 
     printError(errMsg: "Image output not available!") 
     return 
    } 

    sillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 

    if session.canAddOutput(sillImageOutput) { 
     session.addOutput(sillImageOutput) 
    } 
    session.commitConfiguration() 
    // Add video preview layer 
    _previewLayer = AVCaptureVideoPreviewLayer(session: session) 

    guard let previewLayer = _previewLayer else { 
     printError(errMsg: "Preview layer not available!") 
     return 
    } 

    previewLayer.videoGravity = AVLayerVideoGravity.resizeAspect 
    previewLayer.connection?.videoOrientation = AVCaptureVideoOrientation.portrait 
    guard let view = _previewView else { 
     printError(errMsg: "View not available!") 
     return 
    } 
    view.layer.addSublayer(previewLayer) 
    view.layer.borderWidth = 5 

    // Start the capture session 
    session.startRunning() 
} 

public override func viewDidLoad() { 
    super.viewDidLoad() 
} 

public override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    guard let previewLayer = _previewLayer else { 
     printError(errMsg: "Preview layer not available!") 
     return 
    } 
    guard let previewView = _previewView else { 
     printError(errMsg: "View not available!") 
     return 
    } 
    print(previewView.bounds) 
    previewLayer.frame = previewView.bounds 
} 

private func printError(errMsg: String) { 
    print("[Error]: " + errMsg) 
} 
} 

PlaygroundPage.current.liveView = MainViewController() 

請忽略對私有變量會話等。我知道我可以d使它們成爲本地方法。

我唯一看到的是棕色的背景。 enter image description here 當第一次運行應用程序時,iOS問我Playgrounds應用程序是否應該訪問我接受的相機。在設置中,我還可以看到該應用程序可以訪問相機。

IOS版本:10.3.3 遊樂場應用程序:1.6.1

+1

您需要將視圖的「邊界」作爲幀分配給'previewLayer'。我認爲目前'previewLayer.frame'是'CGRect.zero'。 –

回答

0

它看起來像它只能在iOS 11.我與iOS 10.3覈對iPad上你的代碼和視頻預覽是空的。相同的代碼在正常的應用程序中運行得很好。在運行iOS 11的另一臺平板電腦上,相同的代碼像魅力一樣工作。