¿Cómo get un área de video específica en Swift AVPlayer?

Estoy trabajando en la aplicación Swift base MAC OS-X. El usuario seleccionará un file de video y el NSView Controller reproducirá el video usando AVPlayerView. El usuario puede dibujar un rectángulo sobre el AVPlayerView y he logrado esta funcionalidad. Cómo mostrar el área de video seleccionada en un rectángulo a una camera Capa de vista previa en la parte inferior derecha?

Aquí está la salida: Imagen de salida

Aquí está el Código:

var videoURL = NSURL() // The video file URL by the file chooser var videoSize = NSSize() // Here the video resolution size will be kept ie 720*480 var player:AVPlayerView! // The AVPlayerView to play video var cameraPreviewLayer:AVPlayerLayer! //The right bottom camera Preview Layer var rectangleLayer:AVPlayerLayer! // The rectangle that will draw over AVPlayer while mouse dragging var isClicked = false var startPoint = NSPoint() // holds the starting point location of mouse pointer while draging var rect:NSRect! override func viewDidLoad() { super.viewDidLoad() self.player = AVPlayerView() self.player.frame.origin = CGPoint(x: 0, y: 0) self.player.setFrameSize(self.videoSize) self.player.player = AVPlayer.playerWithURL(videoURL) as! AVPlayer self.view.addSubview(self.player) setupRectangle() setupCameraPreviewLayer() } // intially setup white color rectangle that will draged over AVPlayer func setupRectangle() { self.rectangleLayer = AVPlayerLayer() self.rectangleLayer.backgroundColor = NSColor.clearColor().CGColor self.rectangleLayer.borderColor = NSColor.whiteColor().CGColor self.rectangleLayer.borderWidth = 1.5 self.rectangleLayer.frame = self.player.bounds } // intially setup CameraPreview Layer that will show at right bottom of AVPlayer func setupCameraPreviewLayer(){ cameraPreviewLayer = AVPlayerLayer(player: self.player.player) //place the cameraPreview layer at right bottom cameraPreviewLayer.frame.origin.x = self.player.framesize.width-100 cameraPreviewLayer.frame.origin.y = self.player.frame.origin.y-100 cameraPreviewLayer.frame.size.width = 100 cameraPreviewLayer.frame.size.height = 100 } override func mouseDown(theEvent: NSEvent) { startPoint = theEvent.locationInWindow isClicked = true removeCameraPreviewLayer() } override func mouseDragged(theEvent: NSEvent) { var endPoint = theEvent.locationInWindow if( isClicked ){ rect = NSRect(x: startPoint.x, y: startPoint.y, width: -(startPoint.x-endPoint.x), height: -(startPoint.y-endPoint.y)) drawCustomRect(rect) } } override func mouseUp(theEvent: NSEvent) { var endPoint = theEvent.locationInWindow if( isClicked ){ // I think we have to do some magic code here addCameraPreviewLayer() } isClicked = false; } // networkingraw the white color rectange over avplayer func drawCustomRect(rect: NSRect) { self.rectangleLayer.frame = rect self.player.layer?.addSublayer(self.rectangleLayer) } // add Camera PreviewLayer from AVPlayer func addCameraPreviewLayer() { self.player.layer?.addSublayer(self.layer) } // remove Camera PreviewLayer from AVPlayer func removeCameraPreviewLayer() { self.cameraPreviewLayer.removeFromSuperlayer() } 

Aquí está la image de salida de deseo que quiero. salida deseada

Supongamos que el video tiene un tamaño de 720 * 480, el usuario ha dibujado un rectángulo y sus puntos son (x1, y1) (x2, y1) (x3, y3) (x4, y4). ¿Cómo podría recortar un video en la camera Capa de vista previa (en la parte inferior derecha) que muestra el video de la zona igual que el rectángulo seleccionado por el usuario?

¿Alguna ayuda para lograr esta funcionalidad? He pasado muchos días en esto y me agoté.

Nota: Puedo hacerlo en open-CV mediante procesamiento de video usando ROI, pero el requisito es hacerlo en el lenguaje SWIFT nativo.

Lo que haría sería crear una capa de contenedor como la capa de vista previa y crear la capa de video de vista previa como una subcapa de la misma. Entonces, básicamente, puedes ajustar el tamaño y la position de la capa de vista previa del video para que coincida con la relación del rectángulo / gran jugador.

Para eso, podrías tratar de configurar la capa de la camera como tal:

 func setupCameraPreviewLayer(){ // Create a camera preview layer container which will be used to mask the preview layer let cameraContainerLayer = AVLayer() cameraContainerLayer.maskToBounds = true //place the cameraContainerLayer at right bottom cameraContainerLayer.frame.size.width = 100 // Change this to whatever size you'd like your preview to be. The preview layer will have the same width/height ratio as the player layer cameraContainerLayer.frame.size.height = cameraContainerLayer.frame.size.width * self.player.framesize.height / self.player.framesize.width cameraContainerLayer.frame.origin.x = self.player.frame.size.width - cameraContainerLayer.frame.size.width cameraContainerLayer.frame.origin.y = self.player.frame.size.height - cameraContainerLayer.frame.size.height // Create the camera preview layer cameraPreviewLayer = AVPlayerLayer(player: self.player.player) //place the cameraPreview layer so that the container layer has the same size ratio as does the selected rectangle to the big preview layer let widthRatio = self.rectangleLayer.bounds.size.width / rect.size.width // rect is the CGRect of the rectangle that the user draw let heightRatio = self.rectangleLayer.bounds.size.height / rect.size.height // rect is the CGRect of the rectangle that the user draw cameraPreviewLayer.frame.size.width = cameraContainerLayer.bounds.size.width * widthRatio cameraPreviewLayer.frame.size.height = cameraContainerLayer.bounds.size.height * heightRatio cameraPreviewLayer.frame.origin.x = //calculate the right X in here based on the widthRatio cameraPreviewLayer.frame.origin.y = //calculate the right X in here based on the widthRatio cameraContainerLayer.addSublayer(cameraPreviewLayer) } 

Algo como esto debería hacer el truco

PS: El código anterior no está probado y / o completo. Es solo algo que debería haberte iniciado en el path correcto.