2016-04-02 36 views
6

के शीर्ष पर ड्रॉ बटन मुझे वीडियो relay next previous , leave comment वीडियो के शीर्ष पर एक लेबल या बटन खींचना है।AVPlayer

comPlayerControl = AVPlayerViewController() 

      if let player = comPlayerControl { 

       let videoURL: String = "http://cdnapi.kaltura.com/p/11/sp/11/playManifest/entryId/"+selectedSubmission.transcodeRefId+"/format/applehttp/protocol/http/a.m3u8" 
       let playerItem = AVPlayerItem(URL: NSURL(string: videoURL)!) 
       commmentPlayer = AVPlayer(playerItem: playerItem) 
       player.player = commmentPlayer 
       player.view.frame = videoCell.frame 
       player.view.sizeToFit() 

       player.showsPlaybackControls = true 
       NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(CommentsTableViewController.playerDidFinishPlaying(_:)), 
        name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem) 

       comPlayerControl.delegate = self 
       videoCell.addSubview(player.view) 
      } 



    func playerDidFinishPlaying(note: NSNotification) { 
    print("Video Finished") 
    let DynamicView=UIView(frame: CGRectMake(100, 200, 100, 100)) 
    DynamicView.backgroundColor=UIColor.greenColor() 
    DynamicView.layer.cornerRadius=25 
    DynamicView.layer.borderWidth=2 
    DynamicView.layer.zPosition = 1; 
    comPlayerControl.view.addSubview(DynamicView) 
} 
: वीडियो की सूची, यह खेलने के लिए की जरूरत है यह, है एक बार उपयोगकर्ता तालिका से एक आइटम का चयन एक बार जब खिलाड़ी खेलने समाप्त होने पर, उन बटन या लेबल वीडियो

यहाँ के शीर्ष पर आना चाहिए मेरी कोड है

आवश्यकता इस

requirement image

+0

आप परियोजना जो यहाँ था से आसानी से कर सकते हैं: http://stackoverflow.com/a/36389738/1151916 सिर्फ आप xib फ़ाइल में कस्टम बटन और लेबल जोड़ की जरूरत है और वे उपयोगकर्ता के लिए प्रस्तुत किया जाएगा । आप कौन सी कार्यक्षमता चाहते हैं? – Ramis

उत्तर

12

आप एक AVPlayerViewController उपयोग कर रहे हैं में जोड़ने के लिए कोशिश कर सकते हैं, इसलिए एलेसेंड्रो ऑर्नानो के उत्तर में आपके एप्लिकेशन की विंडो तक पहुंचने का कोई कारण नहीं है। पहिया को फिर से क्यों शुरू करें? प्रत्येक AVPlayerViewController में contentOverlayView संपत्ति है जो आपको प्लेयर और नियंत्रण के बीच विचार रखने की अनुमति देती है।

सबसे पहले, एक नया AVPlayerItem बनाएं और उस आइटम पर AVPlayerItemDidPlayToEndTimeNotification सूचना के लिए सुनें। आइटम को अपने प्लेयर में लोड करें और प्लेबैक शुरू करें।

आइटम पूरा होने के बाद, AVPlayerItemDidPlayToEndTimeNotification अधिसूचना को सुनने के लिए आपके द्वारा निर्दिष्ट चयनकर्ता को बुलाया जाएगा। कि चयनकर्ता में, contentOverlayView सीधे प्राप्त कर अपने बटन जोड़ने:

कुछ दृश्य नियंत्रक या अन्य वस्तु में:

let playerVC = AVPlayerViewController() 

// ... 

func setupPlayer { 

    let playerItem = AVPlayerItem(...) 
    playerVC.player?.replaceCurrentItemWithPlayerItem(playerItem) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(VC.itemFinished), name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem) 
    self.presentViewController(playerVC, animated: true) { 
     self.playerVC.player?.play() 
    } 
} 

func itemFinished() { 
    let btn = UIButton(type: .System) 
    btn.addTarget(self, action: #selector(VC.buttonTapped), forControlEvents: .TouchUpInside) 
    self.playerVC.contentOverlayView?.addSubview(btn) 
} 

func buttonTapped() { 
    print("button was tapped") 
    // replay/comment logic here 
} 

के रूप में टिप्पणी (और एक rejected edit) में कहा गया है, बटन contentOverlayView में काम नहीं कर सकता । वैकल्पिक समाधान के लिए, Pyro's answer देखें।

तुम भी AVPlayerViewController उपवर्ग सकता है और अपने उपवर्ग का एक उदाहरण के अंदर सब कुछ करते हैं, लेकिन एप्पल warns against that:

AVPlayerViewController उपवर्ग न करें। इस वर्ग के तरीकों को ओवरराइड करना असमर्थित है और परिणाम अपरिभाषित व्यवहार में हैं।

+0

क्या यह वास्तव में काम करता है? मैं सामग्री दृश्य में कोई दृश्य या बटन जोड़ सकता हूं, लेकिन किसी कारण से मुझे बटन प्राप्त करने के लिए बटन नहीं मिल रहा है ... मैंने आईओएस 10 और 11 के साथ प्रयास किया है। – Seurahepo

2

की तरह मुझे लगता है कि सबसे अच्छा तरीका है avplayer बटन बनाने के लिए यहाँ समझाया गया है: IOS 8 Video Playback using AVPlayer and AVPlayerViewController

तो, मैं prefeer और इन निर्देशों के साथ सहमत हैं, लेकिन अगर आप अभी भी करना चाहते हैं इन बटन जोड़ने आप उन्हें self.window

if let app = UIApplication.sharedApplication().delegate as? AppDelegate, let window = app.window { 
     let myFirstButton = UIButton() 
     myFirstButton.setTitle("test", forState: .Normal) 
     window.addSubview(myFirstButton) 
     ... 
} 
1

Ramis आपके प्रश्न पर और की टिप्पणी/कोड से आधार पर मैं एक नमूना कोड है जो आप की कोशिश कर सकते

जेएएल ने उल्लेख किया contentOverlayView प्रदर्शित करने के लिए सबसे अच्छा विकल्प होना चाहिए बना दिया है AVPlayerController में वीडियो पर नियंत्रण, लेकिन मेरे मेरे नमूना डेमो के अनुसार सामग्रीऑवरलेव्यू में बटन या अन्य नियंत्रणों के लिए कोई उपयोगकर्ता इंटरैक्शन नहीं है, जैसे कि आप AVPlayerController के 3 डी व्यू में चेक इन करते हैं, इसमें AVTouchIgnoringView/UIView से आगे है सामग्रीऑवरले व्यू जो सामग्री के उपयोगकर्ता इंटरैक्शन में समस्या हो सकती है ओवरव्यू व्यू

तो एक और समाधान हम AVPlayerController

पर ओवरले जोड़ सकते प्रारंभिक सेटअप हम AVPlayerController, AVQueuePlayer आदि सेट पर ओवरले दृश्य जोड़ने के लिए AVPlayerViewController

func addContentOverlayView() { 

    OverlayView.frame = CGRectMake(0,30,AVPlayerVC.view.bounds.width, 100) 
    OverlayView.hidden = true 
    OverlayView.backgroundColor = UIColor (red: 0.5, green: 0.5, blue: 0.5, alpha: 0.379) 

    let btnNext = UIButton(frame:CGRectMake(AVPlayerVC.view.bounds.width - 60,0,60,44)) 
    btnNext.setTitle(">>", forState:.Normal) 
    btnNext.addTarget(self, action:"playNext", forControlEvents:.TouchUpInside) 
    //  btnNext.layer.borderColor = UIColor (red: 0.0, green: 0.0, blue: 1.0, alpha: 0.670476140202703).CGColor 
    //  btnNext.layer.borderWidth = 1.0 
    OverlayView.addSubview(btnNext) 

    let btnReplay = UIButton(frame:CGRectMake((AVPlayerVC.view.bounds.width/2)-40,0,80,44)) 
    btnReplay.setTitle("Replay", forState:.Normal) 
    btnReplay.addTarget(self, action:"replayVideo", forControlEvents:.TouchUpInside) 
    OverlayView.addSubview(btnReplay) 

    let btnPrevious = UIButton(frame:CGRectMake(0,0,80,44)) 
    btnPrevious.setTitle("<<", forState:.Normal) 
    btnPrevious.addTarget(self, action:"previousVideo", forControlEvents:.TouchUpInside) 
    OverlayView.addSubview(btnPrevious) 

    let btnComment = UIButton(frame:CGRectMake((AVPlayerVC.view.bounds.width/2)-70,40,140,44)) 
    btnComment.setTitle("Comments", forState:.Normal) 
    btnComment.addTarget(self, action:"openComments", forControlEvents:.TouchUpInside) 
    OverlayView.addSubview(btnComment) 

    AVPlayerVC.view.addSubview(OverlayView); 

} 

func playNext() { 
    prevItem = AVPlayerVC.player?.currentItem 
    OverlayView.hidden = true 
    commmentQueuePlayer.advanceToNextItem() 
} 

func replayVideo() { 
    OverlayView.hidden = true 
    AVPlayerVC.player?.currentItem?.seekToTime(kCMTimeZero) 
    AVPlayerVC.player?.play() 
} 

func previousVideo() { 
    OverlayView.hidden = true 
    if prevItem != AVPlayerVC.player?.currentItem { 
     if (commmentQueuePlayer.canInsertItem(prevItem!, afterItem:AVPlayerVC.player?.currentItem)) { 
      //commmentQueuePlayer.insertItem(prevItem!, afterItem:AVPlayerVC.player?.currentItem) 
      commmentQueuePlayer.replaceCurrentItemWithPlayerItem(prevItem) 
      prevItem = AVPlayerVC.player?.currentItem 
      replayVideo() 
     } 
    } else { 
     replayVideo() 
     //Else display alert no prev video found 
    } 
} 

func stopedPlaying() { 
    if prevItem == nil { 
     prevItem = AVPlayerVC.player?.currentItem 
    } 
    OverlayView.hidden = false 
} 

में ... उस समय है

पिछली वस्तु के लिए कोई प्रत्यक्ष उपलब्ध नहीं है और दस्तावेज के अनुसार आइटम को हटाए जाने के बाद आइटम हटा दिया जाएगा, इसलिए हमारे पास replaceCurrentItemWithPlayerItem या insertItem(item: AVPlayerItem, afterItem: AVPlayerItem?)

यदि आपको पूर्ण जांच की आवश्यकता है तो आइटम दो विकल्प हटा दिए जाएंगे ई कोड आप से यह जांच कर सकते हैं: https://gist.github.com/Pyrolr/debb4fca8f608b1300e099a5b3547031

नोट: यह वह जगह है सिर्फ प्रोटोटाइप की तरह, यह पूरी तरह से सभी मामलों में काम नहीं कर रहा है, लेकिन यह आप चाहता हूँ बुनियादी कार्यक्षमता को समझने में मदद कर सकता है और आप में सुधार कर सकते/अपनी आवश्यकताओं के आधार पर अनुकूलित करें

+1

क्या इससे समस्या हल हो जाती है? – HardikDG

1

मैं आपके वीडियो के शीर्ष पर बटन और अन्य सामग्री दिखाने के तरीके के रूप में AVPlayerLayer को देखने का सुझाव देता हूं।

Advances in AVFoundation Playback WWDC प्रस्तुति देखें।

इसके अलावा, AVFoundationSimplePlayer-iOS उदाहरण प्रोजेक्ट देखें।

अनिवार्य रूप से, आप अपने प्लेयर को होस्ट करने के लिए एक दृश्य बनाते हैं, और आप दृश्य के पीछे परत को AVPlayerLayer में बनाते हैं।

class PlayerView: UIView { 
    var player: AVPlayer? { 
     get { 
      return playerLayer.player 
     } 

     set { 
      playerLayer.player = newValue 
     } 
    } 

    var playerLayer: AVPlayerLayer { 
     return layer as! AVPlayerLayer 
    } 

    override class var layerClass: AnyClass { 
     return AVPlayerLayer.self 
    } 
} 
+0

मुझे यह उत्तर उपयोगी पाया। – jmcmahon443

+0

इस कक्षा का उपयोग कैसे करें कृपया मेरी मदद करें? –