2017-12-05 11 views
0

ビデオ入力をキャプチャする必要があるSwiftベースのMacOSアプリケーションで作業していますが、ビデオを表示するのではなく、バッファリングされたデータを別の場所で処理し、最終的にはSceneKitシーンのオブジェクトに表示します。プレビューウィンドウなしでAVCaptureVideoDataOutputSampleBufferDelegateを使用する

私はprepareCamera方法があるCameraInputクラスがあります。

fileprivate func prepareCamera() { 
     self.videoSession = AVCaptureSession() 
     self.videoSession.sessionPreset = AVCaptureSession.Preset.photo 

     if let devices = AVCaptureDevice.devices() as? [AVCaptureDevice] { 
      for device in devices { 
       if device.hasMediaType(AVMediaType.video) { 
        cameraDevice = device 

        if cameraDevice != nil { 
         do { 
          let input = try AVCaptureDeviceInput(device: cameraDevice) 


          if videoSession.canAddInput(input) { 
           videoSession.addInput(input) 
          } 


          } catch { 
          print(error.localizedDescription) 
         } 
        } 
       } 
      } 

      let videoOutput = AVCaptureVideoDataOutput() 
      videoOutput.setSampleBufferDelegate(self as AVCaptureVideoDataOutputSampleBufferDelegate, queue: DispatchQueue(label: "sample buffer delegate", attributes: [])) 
      if videoSession.canAddOutput(videoOutput) { 
       videoSession.addOutput(videoOutput) 
      } 
     } 
    } 

そしてAVCaptureSessionセッションを開始startSession方法:

fileprivate func startSession() { 
    if let videoSession = videoSession { 
     if !videoSession.isRunning { 
      self.videoInputRunning = true 
      videoSession.startRunning() 
     } 
    } 
} 

私はまた私がキャプチャするAVCaptureVideoDataOutputSampleBufferDelegateを実装しますCMSampleBufferの後の使用:

extension CameraInput: AVCaptureVideoDataOutputSampleBufferDelegate { 

    internal func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 
     print(Date()) 
    } 
} 

ただし、代理人は決して呼び出されません。これは私がのビデオ出力を表示するためにを持っている状況ですか?

+0

これらのコード行はどのクラスで作成していますか?あなたの入力デバイスは何ですか? –

+0

@ElTomato入力デバイスは、私のMacのiSIghtカメラだけです。このクラスは、NSObjectから継承するCameraInputというカスタムクラスです。 – narner

+0

あなたはpreviewLayerを使用していません。それはなんのためですか?私の知る限り、あなたはそれを必要とします。 –

答えて

1

キャプチャしたビデオのプレビューを表示するかどうかに関係なく、問題はありません。

あなたはスウィフト4(とあなたがいるように見える)にしている場合は、あなたが実装するために探しているデリゲートメソッドのシグネチャは、それはthisだ、captureOutput(_:didOutputSampleBuffer:from:)ではありません。

optional func captureOutput(_ output: AVCaptureOutput, 
       didOutput sampleBuffer: CMSampleBuffer, 
        from connection: AVCaptureConnection) 

無関係のヒント:

  • 名前空間の定数は、好きなだけ簡潔にすることができます。例えばvideoSession.sessionPreset = .photo

  • AVCaptureDevice.devices()は推奨されていません。代わりにちょうどask AVCaptureDevice for exactly the kind of device you want、自分でそれを呼び出して、デバイスをループで:あなたのクラスがすでにAVCaptureVideoDataOutputSampleBufferDelegateプロトコルへの適合を宣言している場合

    let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, 
                 for: .video, position: .back) 
    
  • あなたはvideoOutput.setSampleBufferDelegate(self as AVCaptureVideoDataOutputSampleBufferDelegateasキャストは必要ありません。

    最後に

、あなただけのSceneKitシーンの一部にマッピングされたライブからカメラの映像を取得するために探しているなら、iOSの11にあなたがSCNMaterialProperty 'にAVCaptureDeviceを割り当てることができることに注意してくださいs contents - 直接ピクセルバッファを取得、処理、移動する必要はありません。

+0

華麗な、ありがとう! – narner

関連する問題