Как получить доступ к камере Mac по умолчанию с помощью быстрого xcode

Сегодня я впервые программирую для Mac. Я пытаюсь получить доступ к камере по умолчанию и показать предварительный просмотр. 2-й шаг я запишу или сделаю снимок, если мне нужно. Для первого шага я написал следующий код

import Cocoa
import AVFoundation
class ViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        var session:AVCaptureSession = AVCaptureSession()
        session.sessionPreset = AVCaptureSessionPresetLow
        var device:AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
        //Preview
        var previewLayer:AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)
        var myView:NSView = self.view
        previewLayer.frame = myView.bounds
        previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        self.view.layer?.addSublayer(previewLayer)
        session.startRunning()
    }
    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}

Я не вижу, чтобы этот код включал камеру моего ноутбука по умолчанию или отображал что-либо в представлении. Что я здесь делаю неправильно? Любое направление или любой пример, который я могу найти, даже если он в Obj-C, будет действительно полезен. ТИА.


person KD.    schedule 28.02.2015    source источник
comment
Проблема с песочницей? Вы смотрели в журнале консоли?   -  person qwerty_so    schedule 28.02.2015
comment
Извините, что за проблема с песочницей? Никаких ошибок на консоли и никаких ошибок не возникает даже во время отладки. Запуск без сертификата разработчика, так как еще нет сертификата разработчика Mac   -  person KD.    schedule 28.02.2015
comment
Приложения для Mac могут работать в песочнице (или должны, если вы размещаете их в AppStore). Так что можете забыть об этом...   -  person qwerty_so    schedule 28.02.2015
comment
@КД. вы с этим чего-нибудь добились?   -  person colincameron    schedule 16.01.2018
comment
Вот моя рабочая суть gist.github.com/knoguchi/9c7cd044f5cfcea112e0aa634d9f4e04   -  person Kenji Noguchi    schedule 01.01.2019
comment
Я не нашел ни один из приведенных ниже ответов полезным, но использовал форму кода github. com/fbukevin/AccessCamera/blob/master/AccessCamera/, я смог приступить к работе.   -  person Peter    schedule 14.08.2019


Ответы (4)


В вашем коде

self.view.layer?.addSublayer(previewLayer)

не будет выполнено, так как self.view.layer равно nil, поэтому оно не будет выполнено.

Увы, проблема не только в этом, так как даже при добавлении слоя камера не начинает работать. Вам, вероятно, придется копаться в этом:

https://developer.apple.com/library/mac/samplecode/AVRecorder/Introduction/Intro.html

person qwerty_so    schedule 28.02.2015
comment
попробуй self.view.wantsLayer = true - person Glass; 16.12.2017

Рабочий код в Swift 5.

import Cocoa
import AVFoundation

class SomwViewController: NSViewController {
    @IBOutlet private var cameraView: NSView?
    let session: AVCaptureSession = AVCaptureSession()

    override func viewDidLoad() {
        super.viewDidLoad()
        cameraView?.wantsLayer = true
        cameraView?.layer?.backgroundColor = NSColor.black.cgColor
        session.sessionPreset = AVCaptureSession.Preset.low
        let input: AVCaptureInput = try! AVCaptureDeviceInput(device: AVCaptureDevice.default(for: .video)!)
        session.addInput(input)
        let previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)
        previewLayer.frame = cameraView!.bounds
        previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill

        cameraView?.layer?.addSublayer(previewLayer)
    }

    override func viewDidAppear() {
        session.startRunning()
    }

    override func viewDidDisappear() {
        session.stopRunning()
    }
}

Вы определенно не должны использовать принудительную развертку, это просто пример.

person SUMIT NIHALANI    schedule 17.04.2020

Убедитесь, что в вашем представлении есть основной слой анимации в IB:

введите здесь описание изображения

person Rick    schedule 11.06.2016
comment
Это было полезно. Спасибо, Рик! Печально, что без проверки код просто запускается без исключений, но ничего не делает. - person rudyryk; 13.10.2016
comment
На самом деле, я нахожу это довольно милым. В Swift вы соглашаетесь на такое поведение с помощью '?'. В случае с IB вам нужно сказать, что вы хотите. Это все равно, что забыть добавить представление, а затем расстроиться из-за того, что нужное представление не появилось. - person Rick; 14.10.2016

если кто-то все еще хочет запустить веб-камеру в Mac OS X с помощью swift 3

вот код

@IBOutlet var previewCam: PreviewCam!
override func viewDidLoad()
{
    super.viewDidLoad()
    view.wantsLayer = true
    previewCam.wantsLayer = true
    let session:AVCaptureSession = AVCaptureSession()
    session.sessionPreset = AVCaptureSessionPresetLow
    let device:AVCaptureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
    print("device found = ",device)

    let device_input : AVCaptureDeviceInput = try! AVCaptureDeviceInput(device: device)


    let previewLayer:AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)

    previewLayer.frame = previewCam.bounds
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    self.previewCam.layer?.addSublayer(previewLayer)
    if session.canAddInput(device_input)
    {
        session.addInput(device_input)
    }
    session.startRunning()
}

для тех, кто спрашивал про предварительную камеру

#import "PreviewCam.h"

@implementation PreviewCam

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    // Drawing code here.
    CGContextRef context = [[NSGraphicsContext currentContext]graphicsPort];
    CGContextSetRGBFillColor(context, 0, 0, 0, 0.75);
    CGContextFillRect(context, NSRectToCGRect(dirtyRect));
    self.layer.borderColor = [[NSColor whiteColor]CGColor];
    self.layer.borderWidth = 2.0f;
}
person rolling Ztoned    schedule 27.09.2017
comment
Что такое тип PreviewCam? - person John; 07.11.2017
comment
камера предварительного просмотра - это небольшой фрагмент кода, с которым я отредактирую свой предыдущий ответ. - person rolling Ztoned; 09.11.2017
comment
Будущий интернет-путешественник: Все это можно сделать программно без PreviewCam или IB Builder. - person Sentry.co; 10.11.2017
comment
@GitSync, можете ли вы уточнить? Я изо всех сил пытаюсь заставить это работать - person colincameron; 16.01.2018
comment
в чем твоя проблема? - person rolling Ztoned; 22.01.2018
comment
Ну и к чему тогда был этот комментарий? Если вы не можете или не хотите помогать другим членам сообщества, то зачем вообще комментировать? - person colincameron; 27.02.2018