2015-02-28 1 views
2

Aujourd'hui, je code pour Mac première fois. Ce que j'essaie de faire est d'accéder à la caméra par défaut et d'afficher un aperçu. 2ème étape je vais enregistrer ou prendre un instantané si j'ai besoin. Pour la 1ère étape j'ai écrit le code suivantComment accéder à la caméra par défaut de Mac en utilisant swift xcode

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. 
     } 
    } 
} 

Je ne vois pas ce code tourne sur mon appareil photo par défaut d'ordinateur portable ou d'afficher quoi que ce soit sur le point de vue. Qu'est-ce que je fais mal ici? N'importe quelle direction ou n'importe quel exemple que je peux rechercher même si c'est Obj-C serait vraiment utile. TIA.

+0

question Sandbox? Avez-vous regardé dans le journal de la console? –

+0

Désolé ce qui est un problème de bac à sable? Pas d'erreur sur la console et aucune erreur n'est levée même pendant le débogage. Exécuter sans certificat de développement car il n'y a pas encore de certificat de développement mac –

+0

Les applications Mac peuvent s'exécuter dans un bac à sable (ou si vous les placez sur l'AppStore). Donc vous pouvez oublier ça ... –

Répondre

3

Dans votre code le

self.view.layer?.addSublayer(previewLayer) 

ne seront pas exécutées depuis self.view.layer est nil de sorte que ne soit pas exécutée. Hélas, cela ne semble pas être seulement un problème car même en ajoutant une couche, la caméra ne commence pas à fonctionner. Vous aurez probablement à creuser dans ce:

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

+0

try 'self.view.wantsLayer = true' –

2

Assurez-vous de vérifier que votre vue a une couche Core Animation dans IB:

enter image description here

+0

C'était utile. Merci, Rick! C'est tellement triste que sans le vérifier, le code fonctionne sans exception mais ne fait rien. – rudyryk

+0

En fait, je trouve cela plutôt sympa. Dans Swift, vous acceptez ce comportement avec '?'. Dans le cas de IB, eh bien, vous devez lui dire ce que vous voulez. Ce serait comme oublier d'ajouter un point de vue et ensuite être contrarié qu'une vue que vous vouliez n'apparaisse pas. – Rick

1

si quelqu'un cherche toujours à lancer webcam Mac OS X à l'aide rapide 3

est ici le code

@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() 
} 

pour ceux qui ont demandé à propos de cam aperçu

#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; 
} 
+0

Qu'est-ce que le type "PreviewCam"? – John

+0

Aperçu de la came est un petit morceau de code Je vais modifier ma réponse précédente avec elle –

+1

Future Internet-voyageur: Tout cela peut être fait par programme sans PreviewCam ou IB Builder. – eonist