#swift #avfoundation #swift-playground
#swift #avfoundation #swift-игровая площадка
Вопрос:
Как получить доступ к камере в Swift playgrounds в Mac OS Mojave? Раньше это работало без проблем в High Sierra, однако код, похоже, больше не выполняется корректно, поскольку символ запуска игровых площадок непрерывно вращается, а индикаторы камеры остаются выключенными.
Я получил пример кода, который в прошлом году работал нормально, но сегодня больше не работает. Кто-нибудь знает, что не так и как это исправить?
import Cocoa
import AVFoundation
import AVKit
import QuartzCore
import PlaygroundSupport
let view = NSView(frame: NSRect(x: 0.0, y: 0.0, width: 640.0, height: 480.0))
let session = AVCaptureSession()
session.sessionPreset = AVCaptureSession.Preset.vga640x480
session.beginConfiguration()
session.commitConfiguration()
var input : AVCaptureDeviceInput
if let devices : [AVCaptureDevice] = AVCaptureDevice.devices() as? [AVCaptureDevice] {
for device in devices {
if device.hasMediaType(AVMediaType.video) amp;amp; device.supportsSessionPreset(AVCaptureSession.Preset.vga640x480) {
do {
input = try AVCaptureDeviceInput(device: device as AVCaptureDevice) as AVCaptureDeviceInput
if session.canAddInput(input) {
session.addInput(input)
break
}
}
catch {
error
}
}
}
let output = AVCaptureVideoDataOutput()
output.videoSettings = [kCVPixelBufferPixelFormatTypeKey as AnyHashable as! String: Int(kCVPixelFormatType_32BGRA)]
output.alwaysDiscardsLateVideoFrames = true
if session.canAddOutput(output) {
session.addOutput(output)
}
let captureLayer = AVCaptureVideoPreviewLayer(session: session)
view.wantsLayer = true
view.layer = captureLayer
session.startRunning()
//View -> Assistant Editor -> Show Assistant Editor
PlaygroundPage.current.liveView = view
}
Посмотрел документацию Apple о том, как запросить доступ к камере, я попробовал это, однако, похоже, это не работает на игровых площадках, поскольку у меня все еще возникает та же проблема, когда это реализовано.
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized: // The user has previously granted access to the camera.
self.setupCaptureSession()
case .notDetermined: // The user has not yet been asked for camera access.
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
self.setupCaptureSession()
}
}
case .denied: // The user has previously denied access.
return
case .restricted: // The user can't grant access due to restrictions.
return
}