Как захватить видео без сохранения?

#swift #avfoundation #video-capture

#swift #avfoundation #захват видео

Вопрос:

Я создал пользовательскую камеру, и с ее помощью я хочу записать видео и отправить его следующему VC.

Я попытался сделать это следующим образом, но таким образом видео сохраняется в галерее. Я пока не хочу, чтобы это произошло.

Итак, мой вопрос в том, как мне снимать видео только с помощью пользовательской камеры, не сохраняя его?

   func setupSession() -> Bool {

    captureSession.sessionPreset = AVCaptureSession.Preset.high

    // Setup Camera
    let camera = AVCaptureDevice.default(for: AVMediaType.video)!

    do {
    
        let input = try AVCaptureDeviceInput(device: camera)
    
        if captureSession.canAddInput(input) {
            captureSession.addInput(input)
            activeInput = input
        }
    } catch {
        print("Error setting device video input: (error)")
        return false
    }

    // Setup Microphone
    let microphone = AVCaptureDevice.default(for: AVMediaType.audio)!

    do {
        let micInput = try AVCaptureDeviceInput(device: microphone)
        if captureSession.canAddInput(micInput) {
            captureSession.addInput(micInput)
        }
    } catch {
        print("Error setting device audio input: (error)")
        return false
    }


    // Movie output
    if captureSession.canAddOutput(movieOutput) {
        captureSession.addOutput(movieOutput)
    }

    return true
}

func setupCaptureMode(_ mode: Int) {
    // Video Mode

}

//MARK:- Camera Session
func startSession() {

    if !captureSession.isRunning {
        videoQueue().async {
            self.captureSession.startRunning()
        }
    }
}

func stopSession() {
    if captureSession.isRunning {
        videoQueue().async {
            self.captureSession.stopRunning()
        }
    }
}

func videoQueue() -> DispatchQueue {
    return Dispatch.DispatchQueue.main
}

func currentVideoOrientation() -> AVCaptureVideoOrientation {
    var orientation: AVCaptureVideoOrientation

    switch UIDevice.current.orientation {
        case .portrait:
            orientation = AVCaptureVideoOrientation.portrait
        case .landscapeRight:
            orientation = AVCaptureVideoOrientation.landscapeLeft
        case .portraitUpsideDown:
            orientation = AVCaptureVideoOrientation.portraitUpsideDown
        default:
             orientation = AVCaptureVideoOrientation.landscapeRight
     }

     return orientation
 }


@IBAction func startCapture(_ sender: Any) {
    if cameraButton.titleLabel?.text == "record" {
        cameraButton.setTitle("Stop Recording", for: .normal)
        startRecording()
        runTimer()
        
    }
    else {
        
        stopRecording()
        timer.invalidate()
        cameraButton.setTitle("record", for: .normal)
    }
}

func tempURL() -> URL? {
    let directory = NSTemporaryDirectory() as NSString

    if directory != "" {
        let path = directory.appendingPathComponent(NSUUID().uuidString   ".mp4")
        return URL(fileURLWithPath: path)
    }

    return nil
}

func getPHAssetfromURL(url:URL,onCompleted:@escaping (_ phAsset:PHAsset)->Void){
    var phAsset:PHAsset?
    PHPhotoLibrary.shared().performChanges({
        PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url)
    }) { saved, error in
        if saved {
            let fetchOptions = PHFetchOptions()
            fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
            phAsset = PHAsset.fetchAssets(with: .video, options: fetchOptions).lastObject
            onCompleted(phAsset!)
            
        }
    }
}

func startRecording() {

    if movieOutput.isRecording == false {
    
        let connection = movieOutput.connection(with: AVMediaType.video)
    
        if (connection?.isVideoOrientationSupported)! {
            connection?.videoOrientation = currentVideoOrientation()
        }
    
        if (connection?.isVideoStabilizationSupported)! {
            connection?.preferredVideoStabilizationMode = AVCaptureVideoStabilizationMode.auto
        }
    
        let device = activeInput.device
    
        if (device.isSmoothAutoFocusSupported) {
        
            do {
                try device.lockForConfiguration()
                device.isSmoothAutoFocusEnabled = false
                device.unlockForConfiguration()
            } catch {
               print("Error setting configuration: (error)")
            }
        
        }
  
        outputURL = tempURL()
        movieOutput.startRecording(to: outputURL, recordingDelegate: self)
    
        }
        else {
            stopRecording()
        }
   }

 func stopRecording() {

   if movieOutput.isRecording == true {
       movieOutput.stopRecording()
    }
}

func capture(_ captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAt fileURL: URL!, fromConnections connections: [Any]!) {
    

}

func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) {

    if (error != nil) {
    
        print("Error recording movie: (error!.localizedDescription)")
    
    } else {
    
        let videoRecorded = outputURL! as URL
        
        
        let url = videoRecorded

        getPHAssetfromURL(url: url) {(phAsset) in
            DispatchQueue.main.async {
                //let vc = segue.destination as! VideoPlaybackViewController
                
                let vc : VideoPlaybackViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DisplayVC") as! VideoPlaybackViewController
                
                //let vc = VideoPlaybackViewController()
                        vc.videoTrimmerDelegate = self
                        vc.phAsset = phAsset
            vc.videoURL = url
                  vc.assetURL = url.path
                
                self.present(vc, animated: true, completion: nil)
                
            }
        }
    
    }

}
 

Комментарии:

1. Вы должны сохранить его. Видео не может быть записано в память.

2. могу ли я переопределить обновленное видео в галерее? Например, я хочу захватить видео, затем применить фильтр, а затем сохранить его

3. Я не знаю, что вы подразумеваете под галереей. Вы сохраняете во временный каталог.

4. Я имею в виду «Фотографии» из галереи iPhone

5. Но именно вы вызываете getPHAssetfromURL, который копирует сохраненное видео из временного каталога в библиотеку фотографий. Если вы не хотите этого делать, не делайте этого. У вас есть свобода воли.