iOS 播放 - "Playing on your TV"

iOS Airplay - "Playing on your TV"

我已经使用这段代码显示了播放按钮

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框架中有没有默认方法来显示它。或者我必须自己设计屏幕。此外,没有代表验证设备何时连接以及电影何时通过 iOS 设备开始在 AppleTV 上流式传输。我只有一个变量要检查,即 externalPlaybackActive

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

This video is playing on "Apple TV"

像这样

您似乎在使用 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)

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

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

}