Swift Playground iPad摄像头访问

Swift Playground iPad摄像头访问

问题描述:

在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'。 –

它看起来像它只能在iOS 11.我与iOS 10.3核对iPad上你的代码和视频预览是空的。相同的代码在正常的应用程序中运行得很好。在运行iOS 11的另一台平板电脑上,相同的代码像魅力一样工作。