Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 重用AVPlayer';在TableView中_Ios_Swift_Avfoundation_Avplayer_Avplayerlayer - Fatal编程技术网

Ios 重用AVPlayer';在TableView中

Ios 重用AVPlayer';在TableView中,ios,swift,avfoundation,avplayer,avplayerlayer,Ios,Swift,Avfoundation,Avplayer,Avplayerlayer,有人能帮助创建一个要在tableView中重用的AVPlayer池吗?因此,我们的想法是拥有一个AVPlayer池,比如说3个,并在用户滚动表格时继续重用它们 下面是该应用程序的简要说明以及我们想要构建的内容: 每个视频都是mp4,只有5秒长。因此,每个单元将播放5秒的视频并循环播放 所有视频都是本地的,甚至在向用户显示表格之前都会下载到磁盘上。这将有助于tableView的平滑滚动性能 现在我创建了太多的AVPlayer,没有重用它们,这对性能有不良影响,比如滚动有点不稳定。此外,苹果不允

有人能帮助创建一个要在tableView中重用的
AVPlayer
池吗?因此,我们的想法是拥有一个
AVPlayer
池,比如说3个,并在用户滚动表格时继续重用它们

下面是该应用程序的简要说明以及我们想要构建的内容:

  • 每个视频都是mp4,只有5秒长。因此,每个单元将播放5秒的视频并循环播放
  • 所有视频都是本地的,甚至在向用户显示表格之前都会下载到磁盘上。这将有助于tableView的平滑滚动性能
现在我创建了太多的
AVPlayer
,没有重用它们,这对性能有不良影响,比如滚动有点不稳定。此外,苹果不允许无限量的
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()
}
}
导入UIKit
导入视频播放器
var cache=NSCache()
类FeedTableViewCell:UITableViewCell{
//标记:-属性
@IBOutlet弱var containerView:UIView!
静态let reuseIdentifier=“FeedTableViewCell”
视频:视频{
迪塞特{
如果让cachedVideoPlayerView=cache.object(forKey:video!.preview!.remoteURL作为NSString){
//我们有一个缓存的视频播放器视图!
containerView.addSubview(cachedVideoPlayerView)
}否则{
//没有缓存任何内容。
让previewURL=FileManager.applicationDocumentsDirectory.appendingPathComponent(视频!.preview!.fileName!)
让newVideoPlayer=VIMVideoPlayer()
newVideoPlayer.setURL(previewURL)
newVideoPlayer.isLooping=true
newVideoPlayer.ismute=true
newVideoPlayer.disableAirplay()
让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作为NSString)
}
}
}
//马克:生命周期
重写func awakeFromNib(){
super.awakeFromNib()
打印(“从NIB单元唤醒”)
}
重写func prepareForReuse()函数{
super.prepareforeuse()
}
}
//MARK:-VIMVideoPlayerViewDelegate
扩展FeedTableViewCell:VIMVideoPlayerViewDelegate{
func videoPlayerView(toplayVideoPlayerView:VIMVideoPlayerView!){
videoPlayerView.player.play()
}
}

扩展您使用池的想法,而不是重新发明轮子,为什么不利用
UITableViewCell
当前的可重用性实现?在任何给定时间,
n
“可重用的”
UITableViewCell
s都存在,充当您的池

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

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

--作为补充说明,理论上这是可行的,但还没有用一个实时应用程序进行测试。最明显的警告是,在试图保持60fps时,加载到主线程上的
AVPlayer
中的视频大小

编辑:


有关更多信息,请参阅。

扩展您使用池的想法,而不是重新发明轮子,为什么不利用
UITableViewCell
当前的可重用性实现?在任何给定时间,
n
“可重用的”
UITableViewCell
s都存在,充当您的池

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

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

--作为补充说明,理论上这是可行的,但还没有用一个实时应用程序进行测试。最明显的警告是,在试图保持60fps时,加载到主线程上的
AVPlayer
中的视频大小

编辑:


有关更多信息,请参阅。

的可能重复请参阅我的更新和一些代码。根据您的回答,tableView似乎已经创建了一定数量的
AVPlayer
,我需要做的是通过将当前项替换为新项来重用它们——这正确吗?另外,在我上面的当前代码中,我似乎没有这样做,我正在做的是多次创建一个新的播放器。顺便说一句,
VIMVideoPlayerView
只是一个包装在一个
AVPlayer
上,它是Vimeo的一个库。@JEL确切地说,不是为每个单元格创建一个新的VIMVideoPlayerView,而是在每个单元格中实例化一次,并告诉视图在
prepareforeuse
函数中停止。@JEL请注意,如果
video
变量为nil,代码将崩溃。你应该确保你在处理这个案子的时候有一个警卫/如果让我知道的话,我想我现在开始更了解这一点了。我仍然困惑的是
AVPlayer
的可重用性,因为我不知道如何用新视频替换当前视频。在哪里以及如何进行更换?你能解释一下这是怎么做的,或者发布一些示例代码吗?谢谢请看我的一些代码更新。看起来你的a