2017-02-03 1 views
1

Momentan habe ich eine AVCaptureSession in meiner Swift App ausgeführt und ich habe eine UIView mit einem CGRect, den ich über den Kamera-Feed verschieben möchte. Ich habe versucht, die Position des UIView-Rahmens zu aktualisieren, indem ich die Koordinaten in der Funktion captureOutput ändere, aber wenn ich sie ändere, werden sie nicht aktualisiert. Was ist der richtige Weg, um den Standort von UIView so zu ändern, dass es im laufenden Betrieb aktualisiert wird?Position von UIView in captureOutput ändern

Hier ist der Code-Abschnitt, wo die Aufnahmesitzung gemacht wird:

class CameraViewController: UIViewController, UIImagePickerControllerDelegate, AVCaptureVideoDataOutputSampleBufferDelegate 

{

@IBOutlet weak var cameraView: UIImageView! 
var rectangleView : UIView! 
var captureSession : AVCaptureSession? 
var previewLayer : AVCaptureVideoPreviewLayer? 
var rect = CGRect(x: 150, y: 150, width: 50, height: 50) 
var xCoord: Float = 0.0 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //---editing rectangle view--- 
    rectangleView = UIView() 
    rectangleView.layer.borderColor = UIColor(hue: 0.2444, saturation: 1, brightness: 0.96, alpha: 1).cgColor 
    rectangleView.layer.borderWidth = 50; 
    rectangleView.tag = 1 
    self.view.addSubview(rectangleView) 
    //---------------------------- 


    captureSession = AVCaptureSession() 
    captureSession?.sessionPreset = AVCaptureSessionPreset1920x1080 

    let backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

    var input = AVCaptureDeviceInput() 
    do{ 
     input = try AVCaptureDeviceInput(device: backCamera) 
    }catch{ 
     print("Error finding back Camera") 
    } 
    var error : NSError? 

    if (error == nil && (captureSession?.canAddInput(input))!) 
    { 
     captureSession?.addInput(input) 

     let dataOutput = AVCaptureVideoDataOutput() 
     dataOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "string buffer delegate")) 

     if (captureSession?.canAddOutput(dataOutput))! 
     { 

      captureSession?.addOutput(dataOutput) 
      previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
      previewLayer?.videoGravity = AVLayerVideoGravityResizeAspect 
      previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait 
      //    cameraView.layer.addSublayer(previewLayer!) 
      self.view.layer.addSublayer(previewLayer!) 
      self.view.bringSubview(toFront: rectangleView) 
      previewLayer?.frame = self.view.bounds 
      rectangleView.frame = rect 
      captureSession?.startRunning() 

     } 
    } 
} 

Hier ist die captureOutput Funktion: die Sethos-Methode ist eine Erweiterung der UIView Klasse, die die Änderungen y-Koordinate des Rahmens.

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 

    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer!) 
    let x = rectangleView.frame.origin.x 
    let y = rectangleView.frame.origin.y - 1 
    let height = rectangleView.frame.size.height 
    let width = rectangleView.frame.size.width 

    rectangleView.setY(y: y) 

    print(rectangleView.frame.origin.y) 

    //*** Making UIImage out of pixelBuffer **** 
    let ciImage = CIImage(cvPixelBuffer: pixelBuffer!) 
    let pixelBufferWidth = CGFloat(CVPixelBufferGetWidth(pixelBuffer!)) 
    let pixelBufferHeight = CGFloat(CVPixelBufferGetHeight(pixelBuffer!)) 
    let imageRect:CGRect = CGRect(x: 0,y: 0,width: pixelBufferWidth, height: pixelBufferHeight) 
    let ciContext = CIContext.init() 
    let cgimage = ciContext.createCGImage(ciImage, from: imageRect) 
    let image = UIImage(cgImage: cgimage!) 
    //****************************************** 



} 

Danke für die Hilfe,

-nfarrell

+0

Können Sie teilen Sie Ihre Code? –

+0

Yup ich werde es jetzt bearbeiten. – NFarrell

+0

Haben Sie versucht, die 'setY (y:)' Methode im Haupt-Thread aufzurufen? 'DispatchQueue.main.async {self.rectangleView.setY (y: y)}'. (Ich nehme an, Sie haben die 'setY' Methode außerhalb dieser Methode getestet und bestätigt, dass es wie erwartet funktioniert) –

Antwort

0

Sie benötigen die setY(y:) Methode auf dem Hauptthread nennen, da sie die UI Manipulation ist:

DispatchQueue.main.async { 
    self.rectangleView.setY(y: y) 
} 
Verwandte Themen