iOS Airplay - "在电视上播放"

Tai*_*mal 6 ios avplayer airplay apple-tv avplayerviewcontroller

我已使用此代码显示了播放按钮

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()
Run Code Online (Sandbox Code Playgroud)

现在,我想要显示一个屏幕.iOS Airplay框架中是否有任何默认方法可以显示它.或者我必须自己设计屏幕.此外,没有代表可以验证设备何时连接,并且电影通过iOS设备在AppleTV上开始流式传输.我只有一个变量来检查即externalPlaybackActive

问题是如果我使用变量它将不是有效的解决方案,因为我可以在播放期间从Control连接airplay.如果电影在AppleTV上播放,我不想在每秒后运行计时器来检查.有更好的想法吗?

这个视频正在"Apple TV"上播放

像这样 图片

Tai*_*mal 3

我就是这样实现的。它就像一个魅力!

//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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

//设置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)
    }

}
Run Code Online (Sandbox Code Playgroud)