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
Können Sie teilen Sie Ihre Code? –
Yup ich werde es jetzt bearbeiten. – NFarrell
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) –