2017-01-19 2 views
1

AVCaptureFileOutputRecordingDelegate을 사용하여 비디오를 녹화하고 있습니다. 1 초간 동영상을 저장하고 파일 경로를 변경하고 다음 초를 다른 곳에 저장하고 싶습니다.1 초 녹화하기 스위프트?

이것이 가능합니까? 설정해야 할 타이머가 있습니까? 맥 OS X AVCaptureMovieFileOutput 수에

override func viewWillAppear(_ animated: Bool) { 
     let deviceDiscoverySession = AVCaptureDeviceDiscoverySession(deviceTypes: [AVCaptureDeviceType.builtInDuoCamera, AVCaptureDeviceType.builtInTelephotoCamera,AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back) 

    for device in (deviceDiscoverySession?.devices)!{ 
     if(device.position == AVCaptureDevicePosition.back){ 

      do{ 
       let input = try AVCaptureDeviceInput(device: device) 

       if captureSession.canAddInput(input){ 

        captureSession.addInput(input) 

       } 

       // sessionOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString) : NSNumber(value: kCVPixelFormatType_420YpCbCr8BiPlanarFullRange as UInt32)] 

       sessionOutput.alwaysDiscardsLateVideoFrames = true 

       if(captureSession.canAddOutput(sessionOutput) == true){ 
        captureSession.addOutput(sessionOutput) 

        let previewLayer: AVCaptureVideoPreviewLayer = { 
         let preview = AVCaptureVideoPreviewLayer(session: self.captureSession) 
         preview?.bounds = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height) 
         preview?.position = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.midY) 
         preview?.videoGravity = AVLayerVideoGravityResize 
         return preview! 
        }() 

        view.layer.insertSublayer(previewLayer, at: 0) 

        output = AVCaptureMovieFileOutput() 
        let maxDuration = CMTimeMakeWithSeconds(180, 30) 
        output.maxRecordedDuration = maxDuration 
        captureSession.addOutput(output) 



       } 

       captureSession.commitConfiguration() 

      } 

      catch{ 
       print("Error") 
      } 


     } 

    } 

    let deviceDiscoverySession2 = AVCaptureDeviceDiscoverySession(deviceTypes: [AVCaptureDeviceType.builtInMicrophone], mediaType: AVMediaTypeAudio, position: AVCaptureDevicePosition.unspecified) 

    for device in (deviceDiscoverySession2?.devices)!{ 


     do{ 
      let input = try AVCaptureDeviceInput(device: device) 

      if captureSession.canAddInput(input){ 

       captureSession.addInput(input) 

      } 



     captureSession.commitConfiguration() 

     } 

     catch{ 
      print("Error") 
     } 





} 

}

+0

일부 IBOutlets를 유선에 연결하고 나중에 스토리 보드에서 제거 했습니까? – Bluewings

답변

1

: 여기

let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString 
let outputPath = "\(documentsPath)/output.mov" 
outputURL = NSURL(fileURLWithPath: outputPath) 
output.startRecording(toOutputFileURL: outputURL as URL!, recordingDelegate: self) 

내가 출력 레코드 컨트롤러와 모든 것을 설정하는 코드입니다 : 다음은 내 기록 함수의 코드는 네가 원하는 걸해라. 슈퍼 클래스 AVCaptureFileOutput의 코멘트에서 : recordingDelegate : : 방법

파일 출력은 startRecordingToOutputFileURL을 사용하여 새 파일로 녹음을 시작할 수 있습니다. Mac OS X에서이 메소드를 연속적으로 호출 할 때 미디어 파일을 잃지 않고 동적으로 출력 파일을 변경할 수 있습니다.

아이폰 OS에 당신은 당신이 만들 시작하고 각 세그먼트 중지 AVCaptureVideoDataOutput, AVCaptureAudioDataOutputAVAssetWriter s의 조합에 다시 드롭해야합니다.

가장 쉬운 작업은 아닙니다. 무엇을 성취하려고합니까? 대신 하나의 파일에 기록한 다음 사후 처리 단계에서 세그먼트로 분할 할 수 있습니까?

+0

아쉽게도 단일 파일을 분할하는 대신 개별 파일을 기록한 다음 병합해야합니다. –

+0

나는 대답을 받아 들여서 놀랐다. 요구 사항이 바뀌 었는가? –

+0

아니,하지만 그들은 당신의 대답은 내 질문에 대한 기본적인 해결책이라고 생각합니다. –