2016-04-02 3 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 и делать все, что внутри экземпляра подкласса, но Apple, warns against that:

Не подкласс AVPlayerViewController. Переопределение методов этого класса не поддерживается и приводит к неопределенному поведению.

+0

Действительно ли это работает? Я могу добавить представление или кнопку в представление контента, но по какой-то причине я, похоже, не получаю кнопку для получения касаний ... Я пытался с iOS 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

Исходя из вашего вопроса и от комментария/код из Рамис я сделал пример кода, который вы можете попробовать

Как отметил JAL contentOverlayView должен быть лучшим вариантом для отображения контроль над видео в AVPlayerController, но, как и в моей демонстрационной демонстрации, у contentOverlayview нет никакого взаимодействия с пользователем для кнопок или других элементов управления, как если бы вы просматривали трехмерный вид AVPlayerController, у него есть AVTouchIgnoringView/UIView впереди contentOverlayView, который может быть проблемой при взаимодействии пользователя contentOverlayView

Так другое решение, чтобы добавить вид наложения в 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 
} 

В начальной установке мы устанавливаем AVPlayerController, AVQueuePlayer и т.д ... в то время, мы можем добавить наложение на AVPlayerController

для предыдущего пункта нет прямого доступны и в соответствии с документацией деталь будет удалить, как только это следующий пункт играет, поэтому у нас есть две опции, как replaceCurrentItemWithPlayerItem или insertItem(item: AVPlayerItem, afterItem: AVPlayerItem?)

Если вам нужно проверить Complet е-код, вы можете проверить его из: https://gist.github.com/Pyrolr/debb4fca8f608b1300e099a5b3547031

Примечание: Это так же, как прототип, он не работает отлично во всех случаях, но это может помочь вам понять основные функциональные возможности вы wnat и вы можете улучшить/оптимизируйте в соответствии с вашими требованиями

+1

Решает ли проблема? – HardikDG

1

Я рекомендую искать AVPlayerLayer как способ отображения кнопок и другого содержимого поверх вашего видео.

См. Презентацию WWDC Advances in AVFoundation Playback.

Кроме того, ознакомьтесь с примером проекта 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

Как использовать этот класс, пожалуйста, помогите мне? –

Смежные вопросы