2015-06-04 11 views
10

मैं स्विफ्ट बेस मैक ओएस-एक्स एप्लिकेशन पर काम कर रहा हूं। उपयोगकर्ता एक वीडियो फ़ाइल का चयन करेगा और NSView नियंत्रक AVPlayerView का उपयोग कर वीडियो चलाएगा। उपयोगकर्ता AVPlayerView पर एक आयताकार खींच सकता है और मैंने इस कार्यक्षमता को हासिल किया है। चयनित क्षेत्र वीडियो को आयत में कैमरा पूर्वावलोकन दाईं ओर लेयर कैसे दिखाएं?स्विफ्ट AVPlayer में एक विशिष्ट वीडियो क्षेत्र कैसे प्राप्त करें?

var videoURL = NSURL() // The video file URL by the file chooser 
var videoSize = NSSize() // Here the video resolution size will be kept i.e. 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; 
} 

// redraw 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() 
} 

यहाँ इच्छा उत्पादन चित्र जो मैं चाहता है: Output Pic

यहाँ कोड है:

यहाँ उत्पादन होता है। desired output

मान लीजिए वीडियो एक आकार 720 * 480 है, उपयोगकर्ता एक आयत बनाएं है और इसके अंक हैं (x1, y1) (x2, y1) (x3, Y3) (x4, Y4)। मैं कैमरा पूर्वावलोकन परत (दाएं तल पर) में एक वीडियो कैसे फसल कर सकता हूं जो उपयोगकर्ता द्वारा चुने गए आयत के समान क्षेत्र का वीडियो दिखाता है?

कोई भी इस कार्यक्षमता को प्राप्त करने में सहायता करता है? मैंने इस पर और निकास पर कई दिन बिताए हैं।

नोट: मैं इसे आरओआई का उपयोग करके वीडियो प्रोसेसिंग द्वारा ओपन-सीवी में कर सकता हूं, लेकिन मूल स्विफ्ट भाषा में इसे करने की आवश्यकता है।

उत्तर

-2

मैं क्या करूँगा पूर्वावलोकन परत के रूप में एक कंटेनर परत बनाते हैं और पूर्वावलोकन वीडियो परत को इसके उपन्यास के रूप में बनाते हैं। फिर आप मूल रूप से हमेशा वीडियो पूर्वावलोकन परत आकार और स्थिति समायोजित कर सकते हैं ताकि यह आयताकार/बड़े खिलाड़ी अनुपात से मेल खा सके।

कि आप इस तरह के रूप में कैमरे परत सेटअप करने के लिए कोशिश कर सकते:

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) 
} 

कुछ इस तरह चाल

पी.एस करना चाहिए: कोड ऊपर का परीक्षण किया और/या पूरा नहीं हुआ है। यह सिर्फ कुछ है जो आपको सही ट्रैक

+1

पर शुरू करना चाहिए था, मैं आपके प्रयास की सराहना करता हूं। लेकिन क्षमा करें, यह काम नहीं करता है। यह क्या कर रहा है कि, उपयोगकर्ता के अनुसार दाएं तल पर "कैमरा पूर्वावलोकन" परत का आकार बदलना वीडियो प्लेयर पर एक आयत खींचता है। यह कोड वीडियो परत के विशिष्ट क्षेत्र का चयन नहीं करता है। मैंने वीडियो प्रसंस्करण द्वारा ओपन-सीवी में पहले से ही वही कामकाजी आवश्यकता पूरी कर ली है। मैं सिर्फ मूल स्विफ्ट भाषा में समाधान ढूंढ रहा था लेकिन देशी स्विफ्ट पुस्तकालयों में इसका समाधान नहीं मिला। – Ali

संबंधित मुद्दे