Macos Can';t使用AVFoundation将JPEG图像写入HDD
我正在使用Macos Can';t使用AVFoundation将JPEG图像写入HDD,macos,cocoa,avfoundation,swift4,core-image,Macos,Cocoa,Avfoundation,Swift4,Core Image,我正在使用AVFoundation模块访问macOS 10.13.3上的FaceTime摄像头 captureSession.startRunning()方法正在运行,相机的指示灯为绿色。但我无法在硬盘上捕获和写入JPEG图像。我的代码怎么了 我需要一个输出jpgimage167x188像素(宽x高) 我在Xcode 9,Swift 4中工作 import Cocoa import AVFoundation import CoreImage class ViewController: NSVi
AVFoundation
模块访问macOS 10.13.3上的FaceTime摄像头
captureSession.startRunning()
方法正在运行,相机的指示灯为绿色。但我无法在硬盘上捕获和写入JPEG图像。我的代码怎么了
我需要一个输出jpg
image167
x188
像素(宽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)
}
}
我的桌面上没有编译器错误和捕获的图像
一次编辑完全改变了这个问题的性质,下面是答案 新答案 这为我捕捉了一个图像。确保沙箱不会阻止您写入指定的路径
AVCaptureStillImageOutput
似乎无法为您调整大小,因此您可以使用其他工具调整大小
旧答案
您的url引用了一个目录。尝试引用文件:
let url = URL(fileURLWithPath: "/Users/swift/Desktop/movie.mov")
您还需要实现AVCaptureVideoDataOutputSampleBufferDelegate
协议
avcapturedevideodataoutput
不是一个文件,它是一种实时获取带有视频和音频缓冲区的回调的方法,您应该在这里向videoWriterInput
添加示例
AVCaptureVideoDataOutput
和AVAssetWriter
的级别非常低。如果您只想录制到一个文件,您可以用更简单的AVCaptureMovieFileOutput
替换它们,不硬编码文件路径将是一个好的开始。您应该使用URL(fileURLWithPath:“/Users/swift/Desktop/”
@andy,正在尝试解决您的问题,今天才意识到我的Mac电脑的网络摄像头已经停止工作,我没有在devices()
call中返回它您知道如何停止录制,而不是停止captureSession的捕获会话。stopRunning()?不要在avcapturedevideodataoutput
回调中写入AVAssetWriter
。p、 这是一个新问题…我的硬盘上仍然没有输出文件。您的代码缺少一些部分,请参阅我的更新答案。您可能应该使用AVCaptureMovieFileOutput
let url = URL(fileURLWithPath: "/Users/swift/Desktop/movie.mov")