【问题标题】:AVFoundation take picture every second SWIFTAVFoundation 每秒拍照 SWIFT
【发布时间】:2016-09-17 20:34:15
【问题描述】:

我正在尝试使用 AVFoundation 框架来拍照并在我的应用程序中对其进行分析。我想让它每秒自动拍照,我该怎么做?

这是我当前的代码,现在它只在调用 capturePhoto() 时拍照。

func setupSession() {
  session = AVCaptureSession()
  session.sessionPreset = AVCaptureSessionPresetPhoto

  let camera = AVCaptureDevice
     .defaultDeviceWithMediaType(AVMediaTypeVideo)

  do { input = try AVCaptureDeviceInput(device: camera) } catch { return }

  output = AVCaptureStillImageOutput()
  output.outputSettings = [ AVVideoCodecKey: AVVideoCodecJPEG ]

  guard session.canAddInput(input)
     && session.canAddOutput(output) else { return }

  session.addInput(input)
  session.addOutput(output)

  previewLayer = AVCaptureVideoPreviewLayer(session: session)

  previewLayer!.videoGravity = AVLayerVideoGravityResizeAspect
  previewLayer!.connection?.videoOrientation = .Portrait

  view.layer.addSublayer(previewLayer!)

  session.startRunning()
}

func capturePhoto() {
  guard let connection = output.connectionWithMediaType(AVMediaTypeVideo) else { return }
  connection.videoOrientation = .Portrait

  output.captureStillImageAsynchronouslyFromConnection(connection) { (sampleBuffer, error) in
     guard sampleBuffer != nil && error == nil else { return }

     let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
     guard let image = UIImage(data: imageData) else { return }

     //do stuff with image

  }
}

我应该改变什么?

【问题讨论】:

    标签: ios swift camera avfoundation avcapturesession


    【解决方案1】:

    所以创建一个每秒触发一次的 NSTimer,并在该 NSTimer 的方法中调用 capturePhoto:

    创建一个每秒触发一次的计时器:

    var cameraTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, 
      target: self, 
      #selector(timerCalled(_:)), 
      userInfo: nil, 
      repeats: true)
    

    您的 timerCalled 函数可能如下所示:

    func timerCalled(timer: NSTimer) {
      capturePhoto()
    }
    

    【讨论】:

    • 我应该将计时器创建为成员变量并在 viewDidAppear 中调用 timerCalled 吗?
    • 可以,将定时器变量设为成员变量,在viewDidAppear中创建定时器。然后你会在viewWillDisappear 中调用timer.invalidate()
    • 请注意:#selector(timerCalled(_:) 后面缺少右括号,导致构建错误
    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多