Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Can';t使用AVFoundation将JPEG图像写入HDD_Macos_Cocoa_Avfoundation_Swift4_Core Image - Fatal编程技术网

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
image
167
x
188
像素(宽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")