AVPlayer在缓冲后停止播放视频

6
当我从互联网加载视频(10-40MB大小)时,我无法提供流畅的播放体验。我的AVPlayer要么加载整个视频然后播放它,要么播放1秒钟,缓冲然后停止播放。我尝试了无数库、缓冲观察方法和教程,但似乎都没有帮助。
    .
    .
    .

    self.makeLoaderVisible()

    let playerItem = AVPlayerItem(url: url)
    playerItem.addObserver(self, forKeyPath: "playbackBufferEmpty", options: .new, context: nil)
    playerItem.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: .new, context: nil)
    playerItem.addObserver(self, forKeyPath: "playbackBufferFull", options: .new, context: nil)

    avPlayer?.replaceCurrentItem(with: playerItem)
    avPlayer?.automaticallyWaitsToMinimizeStalling = false
    avPlayer?.playImmediately(atRate: 0)
//  avPlayer?.play()

    }


override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if object is AVPlayerItem {
        switch keyPath! {
        case "playbackBufferEmpty":
            // Show loader
            makeLoaderVisible()

        case "playbackLikelyToKeepUp":
            // Hide loader
            hideLoader()

        case "playbackBufferFull":
            // Hide loader
            hideLoader()

        default:
            return
        }
    }
}

https://github.com/delannoyk/AudioPlayer 可能会有所帮助... - Ahmad F
@dfi:你找到解决方案了吗? - Davender Verma
1个回答

18

自从iOS 10.x以来,您可以进行一些缓冲设置,例如您可以决定需要多少秒来缓冲您的视频:

    if #available(iOS 10.0, tvOS 10.0, OSX 10.12, *) {
        avPlayer?.automaticallyWaitsToMinimizeStalling = .playWhenBufferNotEmpty
        //preferredForwardBufferDuration -> default is 0, which means `AVPlayer` handle it independently, try more seconds like 5 or 10.
        playerItem.preferredForwardBufferDuration = TimeInterval(5) 
    }

avPlayer?.automaticallyWaitsToMinimizeStalling = .playWhenBufferNotEmpty. 不起作用,因为它只接受布尔值true或false。 - Davender Verma
cell.viewForVideo.player?.automaticallyWaitsToMinimizeStalling = .play. 会导致错误。 - Davender Verma
尝试使用以下代码:player?.automaticallyWaitsToMinimizeStalling = playerItem?.isPlaybackBufferEmpty ?? false 其中 player 是您的 avPlayer,而 playerItem 是您的 AVPlayerItem。祝好运。 - Alessandro Ornano
@Alessamdro. cell.viewForVideo.player?.automaticallyWaitsToMinimizeStalling = cell.viewForVideo.player?.currentItem?.isPlaybackBufferEmpty ?? false cell.viewForVideo.player?.currentItem?.preferredForwardBufferDuration = TimeInterval(5) cell.viewForVideo.player?.playImmediately(atRate: 1.0) - Davender Verma
只是一个10到15秒的视频,因为视频很慢。 - Davender Verma
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接