1
現在、私はSwiftアプリケーションでAVCaptureSessionを実行していますが、カメラフィード上で移動したいCGRectを持つUIViewがあります。私は、captureOutput関数の座標を変更することによってUIViewのフレームの位置を更新しようとしていますが、私はそれらを変更するので、更新していません。 UIViewの場所を変更して即座に更新するための適切な方法は何ですか?ここcaptureOutput内のUIViewの位置を変更します
は、キャプチャセッションが行われるコードのセクションの:
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()
}
}
}
ここcaptureOutput関数は次のとおり SETYの方法が変化UIViewクラスの拡張でありますフレームのy座標。助けのための
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!)
//******************************************
}
おかげで、
は、それがUIを操作していますので、あなたは、メインスレッド上でsetY(y:)
メソッドを呼び出す必要が
を、あなたを共有することができますコード? –
よろしくお願いします。 – NFarrell
メインスレッドで 'setY(y:)'メソッドを呼び出そうとしましたか? 'DispatchQueue.main.async {self.rectangleView.setY(y:y)}'。 (私はあなたがこのメソッドの外で 'setY'メソッドをテストし、期待どおりに動作することを確認していると仮定しています) –