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
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
Ich habe nicht verwenden 'AVCaptureVideoPreviewLayer' in diesem Fall aber OpenGL einzustellen. Zum Capturen bearbeite ich den Post für diesen Teil. – sarunw