【发布时间】:2018-08-16 15:31:49
【问题描述】:
我正在使用AVFoundation 模块来访问 macOS 10.13.3 上的 FaceTime 摄像头。
captureSession.startRunning() 方法正在运行,相机指示灯为绿色。但我无法在硬盘上捕获和写入 JPEG 图像。我的代码有什么问题?
我需要输出 jpg 图像 167x188 像素(宽 x 高)。
我正在使用 Xcode 9、Swift 4。
import Cocoa
import AVFoundation
import CoreImage
class ViewController: NSViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
@IBOutlet weak var camera: NSView!
@IBOutlet weak var captureButton: NSButton!
@IBOutlet weak var saveButton: NSButton!
let captureSession = AVCaptureSession()
var captureDevice: AVCaptureDevice?
var previewLayer: AVCaptureVideoPreviewLayer?
var imageOutput: AVCaptureStillImageOutput?
override func viewDidLoad() {
super.viewDidLoad()
self.view.layer?.backgroundColor = NSColor.black.cgColor
camera.layer = CALayer()
captureSession.sessionPreset = AVCaptureSession.Preset.low
let devices = AVCaptureDevice.devices()
for device in devices {
print(device)
if ((device as AnyObject).hasMediaType(AVMediaType.video)) {
print(device)
captureDevice = device
}
}
if captureDevice != nil {
do {
try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice!))
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer?.frame = (self.camera.layer?.frame)!
self.camera.layer?.addSublayer(previewLayer!)
captureSession.startRunning()
} catch {
print(AVCaptureSessionErrorKey.description)
}
}
}
var assetWriter: AVAssetWriter!
var imageWriterInput: AVAssetWriterInput!
let outputSettings = [String: Any]()
let url = URL(fileURLWithPath: "/Users/catalyst/Desktop/image.jpg")
@IBAction func captureImage(_ sender: NSButton) {
print("Taking photo...")
imageOutput = AVCaptureStillImageOutput()
imageOutput?.outputSettings = [
AVVideoCodecKey: AVVideoCodecType.jpeg,
AVVideoWidthKey: NSNumber(value: Float(167)),
AVVideoHeightKey: NSNumber(value: Float(188))
] as [String : Any]
if captureSession.canAddOutput(imageOutput!) {
captureSession.addOutput(imageOutput!)
}
}
@IBAction func saveImage(_ sender: NSButton) {
print("Saving photo...")
let writerFileName = url
assetWriter = try? AVAssetWriter(outputURL: writerFileName, fileType: AVFileType.jpg)
imageWriterInput = AVAssetWriterInput(mediaType: AVMediaType.video, outputSettings: outputSettings)
assetWriter.add(imageWriterInput)
}
}
没有编译器错误,我的桌面上也没有捕获的图像。
【问题讨论】:
-
不硬编码文件路径将是一个好的开始。
-
你应该使用
URL(fileURLWithPath: "/Users/swift/Desktop/") -
@andy,正试图解决您的问题,今天才意识到我的 Mac 网络摄像头已经停止工作,我没有在
devices()电话中返回它
标签: macos cocoa avfoundation swift4 core-image