2016-04-01 4 views
0

Ich konfigurierte die hintere Kamera zu 120 fps. Wenn ich jedoch die Sample-Ausgabe mit captureOutput() überprüfte, indem ich die Zeit ausgab, die diese Funktion aufgerufen wurde (siehe unten), beträgt der Unterschied ungefähr 33 ms (30 fps). Egal, welche fps ich mit activeVideoMinFrameDuration und activeVideoMaxFrameDuration eingestellt habe, die resultierenden fps, die in captureOutput() beobachtet wurden, sind immer 30 fps.Warum gibt das Video IMMER 30 fps aus, obwohl es anders eingestellt ist?

Ich habe dies auf einem iPhone 6 getestet, das Zeitlupenvideo verarbeiten kann. Ich habe das offizielle Dokument von Apple unter https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html gelesen. Irgendeine Ahnung?

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate 
{ 
    var captureDevice: AVCaptureDevice? 
    let captureSession = AVCaptureSession() 
    let videoCaptureOutput = AVCaptureVideoDataOutput() 

    var startTime = NSDate.timeIntervalSinceReferenceDate() 

    // press button to start the video session 
    @IBAction func startPressed() { 
     if captureSession.inputs.count > 0 && captureSession.outputs.count > 0 { 
      startTime = NSDate.timeIntervalSinceReferenceDate() 
      captureSession.startRunning() 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // set capture session resolution 
     captureSession.sessionPreset = AVCaptureSessionPresetLow 

     let devices = AVCaptureDevice.devices() 
     var avFormat: AVCaptureDeviceFormat? = nil 
     for device in devices { 
      if (device.hasMediaType(AVMediaTypeVideo)) { 
       if (device.position == AVCaptureDevicePosition.Back) { 
        for vFormat in device.formats { 
         let ranges = vFormat.videoSupportedFrameRateRanges as! [AVFrameRateRange] 
         let filtered: Array<Double> = ranges.map({ $0.maxFrameRate }).filter({$0 >= 119.0}) 
         if !filtered.isEmpty { 
          // found a good device with good format! 
          captureDevice = device as? AVCaptureDevice 
          avFormat = vFormat as? AVCaptureDeviceFormat 
         } 
        } 
       } 
      } 
     } 

     // use the found capture device and format to set things up 
     if let dv = captureDevice { 
      // configure 
      do { 
       try dv.lockForConfiguration() 
      } catch _ { 
       print("failed locking device") 
      } 

      dv.activeFormat = avFormat 
      dv.activeVideoMinFrameDuration = CMTimeMake(1, 120) 
      dv.activeVideoMaxFrameDuration = CMTimeMake(1, 120) 
      dv.unlockForConfiguration() 

      // input -> session 
      do { 
       let input = try AVCaptureDeviceInput(device: dv) 
       if captureSession.canAddInput(input) { 
        captureSession.addInput(input) 
       } 
      } catch _ { 
       print("failed adding capture device as input to capture session") 
      } 
     } 

     // output -> session 
     let videoQueue = dispatch_queue_create("videoQueue", DISPATCH_QUEUE_SERIAL) 
     videoCaptureOutput.setSampleBufferDelegate(self, queue: videoQueue) 
     videoCaptureOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA)] 
     videoCaptureOutput.alwaysDiscardsLateVideoFrames = true 
     if captureSession.canAddOutput(videoCaptureOutput) { 
      captureSession.addOutput(videoCaptureOutput) 
     } 
    } 

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) 
    { 
     print("\(NSDate.timeIntervalSinceReferenceDate() - startTime)") 

     // More pixel/frame processing here 
    } 
} 

Antwort

0

Antwort gefunden. Befehle der beiden Blöcke "configure" und "input -> session" werden vertauscht.

Verwandte Themen