ビデオ入力をキャプチャする必要がある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())
}
}
ただし、代理人は決して呼び出されません。これは私がのビデオ出力を表示するためにを持っている状況ですか?
これらのコード行はどのクラスで作成していますか?あなたの入力デバイスは何ですか? –
@ElTomato入力デバイスは、私のMacのiSIghtカメラだけです。このクラスは、NSObjectから継承するCameraInputというカスタムクラスです。 – narner
あなたはpreviewLayerを使用していません。それはなんのためですか?私の知る限り、あなたはそれを必要とします。 –