2016-04-02 19 views
6

Tôi phải vẽ nhãn hoặc nút ở đầu video relay next previous , leave comment. Danh sách video đã nó, khi người dùng chọn một mục từ bảng, nó cần để chơi, khi người chơi chơi xong, những nút hay nhãn hiệu này nên đến trên cùng của videoNút vẽ trên đầu AVPlayer

Đây là mã của tôi:

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

yêu cầu như thế này

requirement image

+0

Bạn có thể làm điều đó dễ dàng từ dự án đã có tại đây: http://stackoverflow.com/a/36389738/1151916 Chỉ bạn cần thêm các nút và nhãn tùy chỉnh trong tệp xib và chúng sẽ được hiển thị cho người dùng . Bạn muốn có chức năng nào? – Ramis

Trả lời

12

Bạn đang sử dụng một AVPlayerViewController, vì vậy không có lý do gì để truy cập cửa sổ ứng dụng của bạn như trong câu trả lời của Alessandro Ornano. Tại sao tái tạo lại bánh xe? Mỗi AVPlayerViewController có thuộc tính contentOverlayView cho phép bạn đặt chế độ xem giữa trình phát và điều khiển.

Trước tiên, hãy tạo AVPlayerItem mới và nghe thông báo AVPlayerItemDidPlayToEndTimeNotification về mục đó. Tải mục vào trình phát của bạn và bắt đầu phát lại.

Khi mục hoàn tất, bộ chọn bạn đã chỉ định để nghe thông báo AVPlayerItemDidPlayToEndTimeNotification sẽ được gọi. Trong selector đó, truy cập vào contentOverlayView trực tiếp và thêm các nút của bạn:

Trong một số bộ điều khiển xem hoặc đối tượng khác:

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 
} 

Như đã trình bày trong các ý kiến ​​(và một rejected edit), các nút có thể không hoạt động trong contentOverlayView . Để biết giải pháp thay thế, hãy xem Pyro's answer.

Bạn cũng có thể phân lớp AVPlayerViewController và làm tất cả mọi thứ bên trong một thể hiện của lớp con của bạn, nhưng Apple warns against that:

Đừng phân lớp AVPlayerViewController. Việc ghi đè các phương thức của lớp này không được hỗ trợ và dẫn đến hành vi không xác định.

+0

Điều này thực sự có hiệu quả không? Tôi có thể thêm một cái nhìn hoặc một nút để xem nội dung, nhưng đối với một số lý do tôi dường như không nhận được nút để nhận được chạm ... Tôi đã thử với iOS 10 và 11. – Seurahepo

2

tôi nghĩ rằng cách tốt nhất để làm cho các nút avplayer được giải thích ở đây: IOS 8 Video Playback using AVPlayer and AVPlayerViewController.

Vì vậy, tôi prefeer và đồng ý với các hướng dẫn, nhưng nếu bạn vẫn muốn thêm các nút này bạn có thể thử để thêm chúng vào các 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

Dựa trên câu hỏi của bạn và từ những nhận xét/code của Ramis tôi đã thực hiện một đoạn code mẫu mà bạn có thể thử

Như đã đề cập bởi JAL các contentOverlayView nên là lựa chọn tốt nhất để hiển thị kiểm soát video trong AVPlayerController, nhưng theo bản demo mẫu của tôi, contentOverlayview không có bất kỳ tương tác người dùng nào cho các nút hoặc các điều khiển khác, như thể bạn kiểm tra chế độ xem 3D của AVPlayerController nó có AVTouchIgnoringView/UIView trước contentOverlayView có thể là sự cố trong tương tác người dùng của contentOverlayView

Vì vậy, một giải pháp khác là thêm chế độ xem lớp phủ trong 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 
} 

Tại thiết lập ban đầu chúng tôi đặt AVPlayerController, AVQueuePlayer vv ... tại thời điểm đó chúng ta có thể thêm lớp phủ trên AVPlayerController

Đối với mục trước không có sẵn trực tiếp và theo tài liệu, mục sẽ bị xóa khi mục tiếp theo được phát, vì vậy chúng tôi có hai tùy chọn như replaceCurrentItemWithPlayerItem hoặc insertItem(item: AVPlayerItem, afterItem: AVPlayerItem?)

Nếu bạn cần kiểm tra hoàn thành mã e bạn có thể kiểm tra xem nó từ: https://gist.github.com/Pyrolr/debb4fca8f608b1300e099a5b3547031

Lưu ý: Đây là giống như nguyên mẫu, nó không làm việc một cách hoàn hảo trong tất cả các trường hợp, nhưng nó có thể giúp bạn trong việc tìm hiểu các chức năng cơ bản bạn wnat và bạn có thể cải thiện/tối ưu hóa dựa trên yêu cầu của bạn

+1

Nó có giải quyết được vấn đề không? – HardikDG

1

Tôi khuyên bạn nên tìm AVPlayerLayer như một cách để hiển thị các nút và nội dung khác ở đầu video của bạn.

Xem bản trình bày Advances in AVFoundation Playback WWDC.

Ngoài ra, hãy xem dự án ví dụ AVFoundationSimplePlayer-iOS.

Về cơ bản, bạn tạo chế độ xem để lưu trữ trình phát của mình và tạo lớp ở phía sau chế độ xem thành 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

Tôi thấy câu trả lời này hữu ích. – jmcmahon443

+0

cách sử dụng lớp học này, xin hãy giúp tôi? –

Các vấn đề liên quan