问题
Today i am coding for Mac first time. What I am trying to do is access the default camera and show a preview. 2nd step i will record or take a snap if i need. For the 1st step i have written the following code
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.
}
}
}
I don't see this code is turning on my laptop default camera or displaying anything on the view. What am i doing wrong here? Any direction or any example i can look for even if its in Obj-C would be really helpful. TIA.
回答1:
In your code the
self.view.layer?.addSublayer(previewLayer)
will not be executed since self.view.layer
is nil
so that won't be executed.
Alas, this does not seem to be only issue since even when adding a layer the camera does not start working. You will likely have to dig into this:
https://developer.apple.com/library/mac/samplecode/AVRecorder/Introduction/Intro.html
回答2:
Be sure to check that your view has a Core Animation Layer in IB:
回答3:
if anyone still looking to launch webcam in Mac OS X using swift 3
here is the 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()
}
for those who asked about preview cam
#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;
}
来源:https://stackoverflow.com/questions/28783312/how-to-access-mac-default-camera-using-swift-xcode