在TableView中重用AVPlayer

时间:2016-11-19 21:16:28

标签: ios swift avfoundation avplayer avplayerlayer

任何人都可以帮助创建一个AVPlayer的池,以便在tableView中重用吗?所以我的想法是拥有一个AVPlayer的池,比方说3,并在用户滚动表时继续重用它们。

这是应用程序的简要概要以及我们想要构建的内容:

  • 每个视频都是mp4,只有5秒钟。因此,每个小区将播放5秒钟的视频并循环播放。
  • 所有视频都是本地视频,在将表格显示给用户之前,它们将被下载到磁盘。这将有助于tableView的平滑滚动性能。

现在我正在创建太多AVPlayer并且没有重复使用它们对性能产生不良影响,例如滚动有点不稳定。此外,Apple不允许创建无限量的AVPlayer

有什么想法吗?感谢

更新1:

import UIKit
import VIMVideoPlayer

var cache = NSCache<NSString, VIMVideoPlayerView>()

class FeedTableViewCell: UITableViewCell {
// MARK: - Properties

@IBOutlet weak var containerView: UIView!

static let reuseIdentifier = "FeedTableViewCell"

var video: Video? {
    didSet {
        if let cachedVideoPlayerView = cache.object(forKey: video!.preview!.remoteURL as NSString)  {
            // We have a cached video player view!
            containerView.addSubview(cachedVideoPlayerView)
        } else {
            // There is nothing cached.
            let previewURL = FileManager.applicationDocumentsDirectory.appendingPathComponent(video!.preview!.fileName!)
            let newVideoPlayer = VIMVideoPlayer()
            newVideoPlayer.setURL(previewURL)
            newVideoPlayer.isLooping = true
            newVideoPlayer.isMuted = true
            newVideoPlayer.disableAirplay()

            let newVideoPlayerView = VIMVideoPlayerView()
            newVideoPlayerView.frame = contentView.bounds
            newVideoPlayerView.delegate = self
            newVideoPlayerView.setVideoFillMode(AVLayerVideoGravityResizeAspectFill)
            newVideoPlayerView.player = newVideoPlayer
            containerView.addSubview(newVideoPlayerView)
            cache.setObject(newVideoPlayerView, forKey: video!.preview!.remoteURL as NSString)
        }
    }
}

// MARK: - Life Cycle

override func awakeFromNib() {
    super.awakeFromNib()

    print("AWAKE FROM NIB CELL")
}

override func prepareForReuse() {
    super.prepareForReuse()

}
}

// MARK: - VIMVideoPlayerViewDelegate
extension FeedTableViewCell: VIMVideoPlayerViewDelegate {
func videoPlayerViewIsReady(toPlayVideo videoPlayerView: VIMVideoPlayerView!) {
    videoPlayerView.player.play()
}
}

1 个答案:

答案 0 :(得分:0)

扩展您使用池的想法,而不是重新发明轮子,为什么不利用UITableViewCell当前实现的可重用性?在任何时候,n可重复使用&#39; UITableViewCell存在,充当你的游泳池。

如果这些单元格中的每一个都包含单个AVPlayer子视图,则表视图将为您完成管理。因此,在UITableViewCell重用标识符中,停止播放器(如果需要),更新其MP4(理想情况下从内存缓存中),然后重新启动它。

如果需要,您可以在单元格消失时缓存视频的位置,以便在滚动过程中看起来视频从未停止播放。

- 作为旁注,从理论上讲这可行,但尚未通过实时应用进行测试。显而易见的警告是在主线程上加载到AVPlayer的视频大小,同时尝试维持60fps。

编辑:

有关详细信息,请参阅https://stackoverflow.com/a/35514126/556479