2016-07-22 6 views
0

Ich spielte mit AVFoundation versuchen, Filter auf Live-Video anwenden. Ich habe versucht, Filter auf AVCaptureVideoDataOutput anzuwenden, aber die Ausgabe belegt nur 1/4 der Ansicht.Bildausgabe von AVFoundation besetzt nur 1/4 des Bildschirms

enter image description here

Hier sind einige meines zugehörigen Code

Capturing

let availableCameraDevices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) 
    for device in availableCameraDevices as! [AVCaptureDevice] { 
     if device.position == .Back { 
      backCameraDevice = device 
     } else if device.position == .Front { 
      frontCameraDevice = device 
     } 
    } 

konfigurieren Ausgabe

private func configureVideoOutput() { 
    videoOutput = AVCaptureVideoDataOutput() 
    videoOutput?.setSampleBufferDelegate(self, queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL)) 
    if session.canAddOutput(videoOutput) { 
     session.addOutput(videoOutput) 
    } 
} 

Get Bild

Render

func cameraController(cameraController: CameraController, didOutputImage image: CIImage) { 
    if glContext != EAGLContext.currentContext() { 
     EAGLContext.setCurrentContext(glContext) 
    } 

    let filteredImage = image.imageByApplyingFilter("CIColorControls", withInputParameters: [kCIInputSaturationKey: 0.0]) 

    var rect = view.bounds 

    glView.bindDrawable() 
    ciContext.drawImage(filteredImage, inRect: rect, fromRect: image.extent) 
    glView.display() 
} 

I Retina-Display und Skalierungsfaktor verursacht dies erwartet, aber nicht sicher, wo soll ich damit umgehen. Ich habe den Inhaltsskalierungsfaktor bereits auf GLKView gesetzt, aber kein Glück.

private var glView: GLKView { 
    // Set in storyboard 
    return view as! GLKView 
} 

glView.contentScaleFactor = glView.bounds.size.width/UIScreen.mainScreen().bounds.size.width * UIScreen.mainScreen().scale 

Antwort

0

Welches Format legen Sie vor Beginn der Aufnahme fest? Bist du sicher, dass der Videovorschau-Layer den gesamten Bildschirm ausfüllt? Sie haben 2 Möglichkeiten Auflösung während eines avcapture einzustellen:

  • die AVCaptureDeviceFormat mit der höchsten Auflösung wählen, von
  • durch die verfügbare Aufnahmeformat suchen, um die sessionPreset Eigenschaft Sie verwenden Sitzung erfassen. Dok. here.
+0

Ich habe nicht verwenden 'AVCaptureVideoPreviewLayer' in diesem Fall aber OpenGL einzustellen. Zum Capturen bearbeite ich den Post für diesen Teil. – sarunw

1

Ihr Problem ist mit dem Ausgang rect in der drawImage Funktion:

ciContext.drawImage(filteredImage, inRect: rect, fromRect: image.extent) 

Das Ausmaß ist das Bild in der tatsächlichen Pixel, während die Grenzen der Ansicht sind Punkte, und werden durch die contentScaleFactor nicht angepasst zu bekommen Pixel. Ihr Gerät hat zweifellos einen contentScaleFactor von 2.0, also ist es 1/2 der Größe in jeder Dimension.

stattdessen die rect als:

var rect = CGRect(x: 0, y: 0, width: glView.drawableWidth, 
          height: glView.drawableHeight) 

drawableWidth und drawableHeight die Dimension in Pixel zurückkehren, das contentScaleFactor ausmacht. Siehe: https://developer.apple.com/reference/glkit/glkview/1615591-drawablewidth

Auch ist es nicht erforderlich, GLview des contentScaleFactor

+0

Dies ist die richtige Antwort. Ich hatte das gleiche Problem, das durch die Anwendung der vorgeschlagenen Änderung in dieser Antwort behoben wird. Vielen Dank. – Mikrasya

Verwandte Themen