iOS Airplay — воспроизведение на вашем телевизоре

Я отобразил кнопку трансляции, используя этот код

var airplayButton: UIBarButtonItem!
let airView: MPVolumeView = MPVolumeView()
airView.showsRouteButton = true
airView.showsVolumeSlider = false
airView.sizeToFit()
airView.tintColor = UIColor.blackColor()

airplayButton = UIBarButtonItem(customView: airView)
airplayButton.tintColor = UIColor.whiteColor()

Теперь я хочу отобразить экран. Есть ли какой-либо метод по умолчанию в iOS Airplay framework для его отображения. Или я должен сам спроектировать экран. Кроме того, нет делегатов для проверки подключения устройства и начала потоковой передачи фильма на AppleTV через устройство iOS. У меня есть только переменная для проверки, т.е. externalPlaybackActive

Проблема в том, что если я использую переменную, это не будет эффективным решением, так как у меня есть трансляция, которую можно подключить из Control во время воспроизведения. Я не хочу запускать таймер, чтобы каждую секунду проверять, транслируется ли фильм на AppleTV. Любые лучшие идеи?

Это видео воспроизводится на «Apple TV»

Вот так изображение


person Taimur Ajmal    schedule 30.06.2016    source источник


Ответы (2)


Вот как я это реализовал. Работает как часы !

//Airplay constants

private var observerContextAirplay = 1

private var propertyToObserveAirplay = "externalPlaybackActive"

 // MARK: AirPlay Key-value Observing

    func startObservingForAirPlayStatusChanges()
    {
        self.player.moviePlayer.addObserver(self, forKeyPath: propertyToObserveAirplay, options: .New, context: &observerContextAirplay)
    }

    func stopObservingForAirPlayStatusChanges()
    {
        self.player.moviePlayer.removeObserver(self, forKeyPath: propertyToObserveAirplay)
    }

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if context == &observerContextAirplay {
            if self.player.moviePlayer.externalPlaybackActive == true
            {                    
                self.setUpAirPlayView()
            }
            else if self.player.moviePlayer.externalPlaybackActive == false
            {
                self.resetPlayerView()
            }

        }
        else {
            super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
        }
    }

//Настройка AirplayView

func setUpAirPlayView()
{
    //Airplay Button

    if self.airPlay_PlayBtn == nil
    {
        let playImage = UIImage(named: "player_play.png")!
        if let _ = self.airPlay_PlayBtnFrame
        {
            self.airPlay_PlayBtn = UIButton(frame: self.airPlay_PlayBtnFrame)
            self.airPlay_PlayBtn.setBackgroundImage(playImage, forState: UIControlState.Normal)
            self.airPlay_PlayBtn.addTarget(self, action: #selector(ICFPlayerViewController.airPlayButtonAction), forControlEvents: UIControlEvents.TouchUpInside)

            self.airPlay_PlayBtn.setBackgroundImage(UIImage(named: "player_play.png"), forState: .Normal)
            self.airPlay_PlayBtn.setBackgroundImage(UIImage(named: "player_pause.png"), forState: .Selected)
            self.airPlay_PlayBtn.center = self.view.center

            self.view.addSubview(self.airPlay_PlayBtn)
            if let _ = self.player
            {
                self.player.playPauseButton.hidden = true
            }
        }
    }
    else
    {
        self.airPlay_PlayBtn.hidden = false
        if let _ = self.player
        {
            self.player.playPauseButton.hidden = true
        }
    }

    // Airplay Label
    if self.airPlayLabel == nil
    {
        self.airPlayLabel = UILabel()
        self.airPlayLabel.frame = CGRectMake(0, 0, 280, 20)

        self.airPlayLabel.text = "Your video is now playing on Apple TV"
        self.airPlayLabel.textAlignment = NSTextAlignment.Center
        self.airPlayLabel.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.6)

        self.airPlayLabel.textColor = UIColor.whiteColor()

        self.airPlayLabel.sizeToFit()

        self.airPlayLabel.center = self.view.center

        self.airPlayLabel.center.y = self.view.center.y - self.activityIndicator.frame.size.height*1.5
        self.view.addSubview(self.airPlayLabel)
    }
    else
    {
        self.airPlayLabel.hidden = false
    }

    // Thumbnail
    self.setupContentThumbnailImageView() //Fetch Thumbnail image
    if let _ = self.thumbnailImage
    {
        self.view.addSubview(self.thumbnailImage)
    }

    self.view.bringSubviewToFront(bottomToolbar)
    self.view.bringSubviewToFront(topToolbar)

    if let _ = self.airPlayLabel
    {
        self.view.bringSubviewToFront(self.airPlayLabel)
    }
    if let _ = self.airPlay_PlayBtn
    {
        self.view.bringSubviewToFront(self.airPlay_PlayBtn)
    }

}
person Taimur Ajmal    schedule 10.07.2016
comment
Вы даже не показываете, что делает self.setUpAirPlayView(). Вы приняли мое предложение и использовали contentOverlayView? - person JAL; 11.07.2016
comment
Да, я сделал, и это не сработало. Нет члена с именем 'contentOverlayView'. Я использую AVPlayer. self.setUpAirPlayView() — это просто функция для отображения представления поверх представления моего проигрывателя. Выложу и эту функцию. - person Taimur Ajmal; 11.07.2016
comment
Правильно, поэтому я сказал, что это сработает, если вы используете AVPlayerViewController, вы не указали, что используете AVPlayer. - person JAL; 11.07.2016

Похоже, вы используете AVPlayerViewController, у которого есть свойство contentOverlayView UIView, которое находится между видеоплеером и элементами управления.

Вы можете начать с установки наблюдателя свойств на externalPlaybackActive, чтобы знать, когда начинается воспроизведение AirPlay. Как только это значение станет истинным, инициализируйте свой UIView, добавьте его в качестве подвида contentOverlayView вашего игрока и поместите его.

let subview = UIView() // your view you want to show when AirPlay is active
subview.frame = CGRect(...)
playerVC.contentOverlayView?.addSubview(subview)
playerVC.contentOverlayView?.bringSubviewToFront(subview)
person JAL    schedule 05.07.2016