【问题标题】:AVPlayer stop UIActivityIndicator before playingAVPlayer 在播放前停止 UIActivityIndi​​cator
【发布时间】:2016-07-25 06:47:48
【问题描述】:

我试图在 AVPlayer 开始播放音乐时停止 activityIndi​​cator,并在 AVPlayer 再次启动(加载、缓冲)时启动 activityIndi​​cator。它有点工作,问题是 AVPlayer 在播放音乐前几秒钟(5,6,7)之前停止了 activityIndi​​cator。并且当它再次(加载,缓冲)时它不会再次启动activityIndi​​cator。任何人都知道我的错误在哪里或我需要解决什么。谢谢

var activityView = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge)

var selectIndex:Int = -1

var check = true
var url : String!
var playerItem:AVPlayerItem?
var player:AVPlayer?

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! RadioCollectionViewCell
    cell.backgroundColor = UIColor.yellowColor()

    let object = objects[indexPath.row]
    cell.img.image = UIImage(named: object["image"]!)
    cell.btnPlay.addTarget(self, action: Selector("audioControlButtonAction:"), forControlEvents: UIControlEvents.TouchUpInside)
    cell.btnPlay.tag = indexPath.row+1


    return cell
}

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){
    print("You selected cell #\(indexPath.item)!")
}

func audioControlButtonAction(sender: UIButton){

    if check == false {
        deallocObservers(player!)
    }



    var btn:NSInteger
    btn = sender.tag as NSInteger

    let object = objects[btn-1]
    let nurl = NSURL(string: "\(object["url"]!)")!
    playerItem = AVPlayerItem(URL: nurl)
    player=AVPlayer(playerItem: playerItem!)

    print(selectIndex)
    if selectIndex != -1 && selectIndex != sender.tag
    {
        let bt:UIButton = self.view.viewWithTag(selectIndex) as! UIButton

        if bt.selected == true
        {
            bt.selected = false
        }
    }

    if sender.selected == false{
        player!.addObserver(self, forKeyPath: "status", options:NSKeyValueObservingOptions(), context: nil)
        player!.addObserver(self, forKeyPath: "playbackBufferEmpty", options:NSKeyValueObservingOptions(), context: nil)
        player!.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options:NSKeyValueObservingOptions(), context: nil)
        player!.addObserver(self, forKeyPath: "playbackBufferFull", options:NSKeyValueObservingOptions(), context: nil)
        player!.addObserver(self, forKeyPath: "loadedTimeRanges", options: NSKeyValueObservingOptions(), context: nil)
        player!.play()
        sender.selected = true
        check = false
        selectIndex = sender.tag
        activityView.startAnimating()


    }
    else{
        activityView.stopAnimating()
        check = true
        player?.pause()
        sender.selected = false
        selectIndex = -1
    }

    print(selectIndex)

}

func deallocObservers(player: AVPlayer) {

    player.removeObserver(self, forKeyPath: "status")
    player.removeObserver(self, forKeyPath: "playbackBufferEmpty")
    player.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp")
    player.removeObserver(self, forKeyPath: "loadedTimeRanges")
    player.removeObserver(self, forKeyPath: "playbackBufferFull")

}


override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>){

    if object?.isEqual(player) == true && keyPath == "status" {

        print(player?.status)

        switch player!.status {

            case AVPlayerStatus.Failed:
                print("Player item status failed")
                player?.play()
            break

            case AVPlayerStatus.ReadyToPlay:
                print("Player item status is ready to play")
                activityView.stopAnimating()
            break

            case AVPlayerStatus.Unknown:
                print("player item status is unknown")
            break
        }

        switch keyPath! {

            case "playbackBufferFull":
                activityView.stopAnimating()
                print("playbackBufferFull")
            break

            case "playbackLikelyToKeepUp":
                activityView.stopAnimating()
                print("playbackLikelyToKeepUp")
            break

            case "playbackBufferEmpty":
                activityView.startAnimating()
                print("playbackBufferEmpty")
            break

            case "loadedTimeRanges":
                print("loadedTimeRanges")

            default:
                print("Error")
            break
        }
    }
}

}

输出

AVPlayer 在(5,6,7 秒)这一行后开始播放 Player item status is ready to play

-1
1
Optional(__C.AVPlayerStatus)
Player item status is ready to play
Error
1
-1
-1
1
Optional(__C.AVPlayerStatus)
Player item status is ready to play
Error

【问题讨论】:

    标签: ios swift swift2 avplayer


    【解决方案1】:

    在您的代码中,每当按下一个单元格时,您就有activityView.stopAnimating()。所以无论如何,动画将在点击时开始或停止,具体取决于if sender.selected == false

    所以我认为如果你删除activityView.stopAnimating() 那么它不会这么早就停止动画。阅读您的问题和代码有点困难,因为我不确定输出的确切来源。

    【讨论】:

    • 当我第一次按下播放按钮时,代码在audioControlButtonAction 按钮上执行if sender.selected == false{............}
    【解决方案2】:

    关于第二个问题,即“并且当它再次(加载,缓冲)时它也不会再次启动activityIndi​​cator”

    我认为解决方法可能是以下之一:-

    一)

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){
        print("You selected cell #\(indexPath.item)!")
    //Start activityView Animation when user clicks on any item which won't be buffered by default
    activityView.startAnimating()
    }
    

    b)

    var selectIndex:Int = -1 {
    didSet {
          //Start activityView Animation when user clicks on any item which won't be buffered by default
          activityView.startAnimating()
           }
    }
    

    【讨论】:

    • 不,我的意思是它第一次显示 activityIndi​​cator 时也会在播放音乐时停止 activityIndi​​cator,但是下次由于 Internet 连接速度慢或由于其他原因它无法启动 startAnimating 时需要再次缓冲或加载。
    • 我认为问题出在observeValueForKeyPath,因为它总是出现在AVPlayerStatus.ReadyToPlaydefault:
    • 也许我不太确定,添加断点并查看执行情况以确认问题是与observerValueForKeyPath 还是其他问题有关。此外,如果由于连接速度较慢,包括检查连接可用性的可达性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多