2016-09-10 15 views
9

हाय मैंने कस्टम कैमरा दृश्य बनाने और AVFoundation का उपयोग करके चित्रों को सहेजने के लिए जेरेड डेविडसन द्वारा एक कोर्स का पालन किया। https://www.youtube.com/watch?v=w0O3ZGUS3pkAVFoundation स्विफ्ट का उपयोग करके वीडियो सहेजें

हालांकि मैं छवियों के बजाय वीडियो रिकॉर्ड और सहेजना चाहता हूं। क्या कोई मेरी मदद कर सकता है? मुझे यकीन है कि यह सरल है लेकिन सेब का दस्तावेज़ीकरण उद्देश्य-सी में लिखा गया है और मैं इसे समझ नहीं सकता।

यह मेरा कोड है। धन्यवाद।

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

    var captureSession = AVCaptureSession() 
    var sessionOutput = AVCaptureStillImageOutput() 
    var previewLayer = AVCaptureVideoPreviewLayer() 


    @IBOutlet var cameraView: UIView! 

    override func viewWillAppear(animated: Bool) { 

     let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) 
     for device in devices { 
      if device.position == AVCaptureDevicePosition.Front{ 


       do{ 

        let input = try AVCaptureDeviceInput(device: device as! AVCaptureDevice) 

        if captureSession.canAddInput(input){ 

         captureSession.addInput(input) 
         sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG] 

         if captureSession.canAddOutput(sessionOutput){ 

          captureSession.addOutput(sessionOutput) 
          captureSession.startRunning() 

          previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
          previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
          previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait 
          cameraView.layer.addSublayer(previewLayer) 

          previewLayer.position = CGPoint(x: self.cameraView.frame.width/2, y: self.cameraView.frame.height/2) 
          previewLayer.bounds = cameraView.frame 


         } 

        } 

       } 
       catch{ 

        print("Error") 
       } 

      } 
     }  

    } 


    @IBAction func TakePhoto(sender: AnyObject) { 

     if let videoConnection = sessionOutput.connectionWithMediaType(AVMediaTypeVideo){ 

      sessionOutput.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { 
       buffer, error in 

       let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) 
       UIImageWriteToSavedPhotosAlbum(UIImage(data: imageData)!, nil, nil, nil) 

      }) 

     } 

    } 

} 

उत्तर

15

आप बनाने और अपने कब्जा सत्र के लिए एक AVCaptureMovieFileOutput जोड़ना और अपनी ViewControllerAVCaptureFileOutputRecordingDelegate के अनुरूप बनाकर फाइल करने के लिए अपने वीडियो रिकॉर्ड बचा सकता है।

यह उदाहरण ऐप की दस्तावेज़ निर्देशिका में "output.mov" नामक फ़ाइल में 5 सेकंड का वीडियो रिकॉर्ड करता है।

class ViewController: UIViewController, AVCaptureFileOutputRecordingDelegate { 

    var captureSession = AVCaptureSession() 
    var sessionOutput = AVCaptureStillImageOutput() 
    var movieOutput = AVCaptureMovieFileOutput() 
    var previewLayer = AVCaptureVideoPreviewLayer() 

    @IBOutlet var cameraView: UIView! 

    override func viewWillAppear(animated: Bool) { 
     self.cameraView = self.view 

     let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) 
     for device in devices { 
      if device.position == AVCaptureDevicePosition.Front{ 


       do{ 

        let input = try AVCaptureDeviceInput(device: device as! AVCaptureDevice) 

        if captureSession.canAddInput(input){ 

         captureSession.addInput(input) 
         sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG] 

         if captureSession.canAddOutput(sessionOutput){ 

          captureSession.addOutput(sessionOutput) 

          previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
          previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
          previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait 
          cameraView.layer.addSublayer(previewLayer) 

          previewLayer.position = CGPoint(x: self.cameraView.frame.width/2, y: self.cameraView.frame.height/2) 
          previewLayer.bounds = cameraView.frame 


         } 

         captureSession.addOutput(movieOutput) 

         captureSession.startRunning() 

         let paths = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
         let fileUrl = paths[0].URLByAppendingPathComponent("output.mov") 
         try? NSFileManager.defaultManager().removeItemAtURL(fileUrl) 
         movieOutput.startRecordingToOutputFileURL(fileUrl, recordingDelegate: self) 

         let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(5 * Double(NSEC_PER_SEC))) 
         dispatch_after(delayTime, dispatch_get_main_queue()) { 
          print("stopping") 
          self.movieOutput.stopRecording() 
         } 
        } 

       } 
       catch{ 

        print("Error") 
       } 

      } 
     } 

    } 

    func captureOutput(captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError!) { 
     print("FINISHED \(error)") 
     // save video to camera roll 
     if error == nil { 
      UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path!, nil, nil, nil) 
     } 
    } 

} 
+0

आप एक्सकोड> डिवाइस> आईफोन> _app name_> कंटेनर डाउनलोड करें में डिवाइस से दस्तावेज़ निर्देशिका डाउनलोड कर सकते हैं। आप 'didISinishRecordingToOutputFileAtURL' प्रतिनिधि विधि से 'UISaveVideoAtPathToSavedPhotosAlbum()' को कॉल करके वीडियो रोल को कैमरे रोल में सहेज सकते हैं। अगर आपके प्रश्न का उत्तर दिया गया है, तो कृपया इस उत्तर को स्वीकार करें। –

+1

हाहा बहुत बहुत धन्यवाद! उम्मीद है कि यह दूसरों की भी मदद करता है क्योंकि मैंने देखा कि बहुत से लोग पूछ रहे थे। –

5

इसके लिए धन्यवाद। यह मेरे लिए बहुत उपयोगी था। यहां आवश्यक आयात विवरण और प्रतिनिधि विधियों के साथ स्विफ्ट 3 पर पोर्ट किए गए Rhythmic Fistman का उत्तर दिया गया है।

import UIKit 
import AVFoundation 

class ViewController: UIViewController, 
AVCaptureFileOutputRecordingDelegate { 

var captureSession = AVCaptureSession() 
var sessionOutput = AVCaptureStillImageOutput() 
var movieOutput = AVCaptureMovieFileOutput() 
var previewLayer = AVCaptureVideoPreviewLayer() 

@IBOutlet var cameraView: UIView! 

override func viewWillAppear(_ animated: Bool) { 
    self.cameraView = self.view 

    let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) 
    for device in devices! { 
     if (device as AnyObject).position == AVCaptureDevicePosition.front{ 


      do{ 

       let input = try AVCaptureDeviceInput(device: device as! AVCaptureDevice) 

       if captureSession.canAddInput(input){ 

        captureSession.addInput(input) 
        sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG] 

        if captureSession.canAddOutput(sessionOutput){ 

         captureSession.addOutput(sessionOutput) 

         previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
         previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
         previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait 
         cameraView.layer.addSublayer(previewLayer) 

         previewLayer.position = CGPoint(x: self.cameraView.frame.width/2, y: self.cameraView.frame.height/2) 
         previewLayer.bounds = cameraView.frame 


        } 

        captureSession.addOutput(movieOutput) 

        captureSession.startRunning() 

        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 
        let fileUrl = paths[0].appendingPathComponent("output.mov") 
        try? FileManager.default.removeItem(at: fileUrl) 
        movieOutput.startRecording(toOutputFileURL: fileUrl, recordingDelegate: self) 

        let delayTime = DispatchTime.now() + 5 
        DispatchQueue.main.asyncAfter(deadline: delayTime) { 
         print("stopping") 
         self.movieOutput.stopRecording() 
        } 
       } 

      } 
      catch{ 

       print("Error") 
      } 

     } 
    } 

} 


//MARK: AVCaptureFileOutputRecordingDelegate Methods 

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

} 

func capture(_ captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) { 
    print("FINISHED \(error)") 
    // save video to camera roll 
    if error == nil { 
     UISaveVideoAtPathToSavedPhotosAlbum(outputFileURL.path, nil, nil, nil) 
    } 
} 

}

+0

वीडियो लाइब्रेरी में रिकॉर्डिंग और बचत कर रहा है लेकिन ध्वनि रिकॉर्ड नहीं की गई है। क्रिप्या मेरि सहायता करे। – iDev750

0

के बाद if (device as AnyObject).position == AVCaptureDevicePosition.front{

जोड़ने

// Audio Input 
       let audioInputDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio) 

       do 
       { 
        let audioInput = try AVCaptureDeviceInput(device: audioInputDevice) 

        // Add Audio Input 
        if captureSession.canAddInput(audioInput) 
        { 
         captureSession.addInput(audioInput) 
        } 
        else 
        { 
         NSLog("Can't Add Audio Input") 
        } 
       } 
       catch let error 
       { 
        NSLog("Error Getting Input Device: \(error)") 
       } 

धन्यवाद

0

ध्वनि रिकॉर्डिंग समस्या के लिए,

captureSession

askMicroPhonePermission (पूरा होने बनाते समय यह कोड जोड़ें:

  if isMicrophonePermissionGiven { 
       do { 
        try self.captureSession.addInput(AVCaptureDeviceInput(device: self.captureAudio)) 
       } catch { 
        print("Error creating the database") 
       } 
      } 
     }) 

में {(isMicrophonePermissionGiven) ///////////////////// ///////////////////////////////////////////

askMicroPhonePermission फ़ंक्शन है जैसा कि

func askMicroPhonePermission(completion: @escaping (_ success: Bool)-> Void) { 
    switch AVAudioSession.sharedInstance().recordPermission() { 
    case AVAudioSessionRecordPermission.granted: 
     completion(true) 
    case AVAudioSessionRecordPermission.denied: 
     completion(false) //show alert if required 
    case AVAudioSessionRecordPermission.undetermined: 
     AVAudioSession.sharedInstance().requestRecordPermission({ (granted) in 
      if granted { 
       completion(true) 
      } else { 
       completion(false) // show alert if required 
      } 
     }) 
    default: 
     completion(false) 
    } 
} 

और आपको एनएसएमइक्रोपोनयूज डिस्क्रिप्शन कुंजी जोड़नी है info.plist फ़ाइल में मूल्य।

संबंधित मुद्दे