【问题标题】:iOS Airplay - "Playing on your TV"iOS Airplay - “在你的电视上播放”
【发布时间】:2016-06-30 09:10:09
【问题描述】:

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

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 上流式传输。有更好的主意吗?

此视频正在“Apple TV”上播放

点赞

【问题讨论】:

    标签: ios avplayer apple-tv airplay avplayerviewcontroller


    【解决方案1】:

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

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

    【讨论】:

    • 你甚至没有展示 self.setUpAirPlayView() 做了什么。你接受我的建议并使用contentOverlayView了吗?
    • 是的,我做到了,但没有用。没有名为“contentOverlayView”的成员。我正在使用 AVPlayer。 self.setUpAirPlayView() 只是一个在我的播放器视图上显示视图的函数。也将发布该功能。
    • 对,这就是为什么我说如果您使用AVPlayerViewController 会起作用,但您没有指定您使用的是AVPlayer
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2013-11-15
      • 2022-01-19
      • 2012-03-08
      相关资源
      最近更新 更多