3

我创建了一个真正简单的播放器类,我将其添加为自定义 uitableviewcell 的属性。我对滚动相当满意,但认为它可能会更好。我有一个“清理”方法,我从播放器类中调用它来准备播放器以供重用。

-(void)URLFromWeb:(NSURL*)URL{


    [self cleanPlayer];



    AVAsset* avAsset = [AVAsset assetWithURL:URL];
    AVPlayerItem *playerItem =[[AVPlayerItem alloc]initWithAsset:avAsset];

    if (!self.player) {

        self.player = [AVPlayer playerWithPlayerItem:playerItem];
        [self.player setActionAtItemEnd:AVPlayerActionAtItemEndNone];

    }

    if (!self.avPlayerLayer) {


        self.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
        self.avPlayerView = [[UIView alloc] initWithFrame:CGRectZero];
        [self.avPlayerView.layer addSublayer:self.avPlayerLayer];

        [self addSubview:self.avPlayerView];

        [self.avPlayerLayer setFrame:CGRectMake(0, 0, 320, 320)];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(playerPlayedToEnd:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:nil];
    }

    [self.avPlayerView removeFromSuperview];
    [self addSubview:self.avPlayerView];

}

这是“cleanPlayer”的代码

    -(void)cleanPlayer{

   [self.avPlayerView removeFromSuperview];

    self.avPlayerView = nil;
    self.avPlayerLayer = nil;
    self.player = nil;


}

如果我从 cleanPlayer 方法中删除[self.avPlayerView removeFromSuperview]行,滚动效果非常棒,但是在滚动相当多次后,单元格停止播放视频并且错误的视频开始在单元格中显示。每次创建单元格时,重新添加代码都会导致轻微的“打嗝”,这有点烦人。任何有关正在发生的事情的见解将不胜感激。哦,我使用了探查器,但在确定原因方面没有发现任何有用的信息。提前致谢!

4

1 回答 1

1

我认为您不应该每次都清除播放器及其层。

您可以实例化一个播放器及其层,UITableViewCell.awakeFromNib()然后在AVPlayer.replaceCurrentItemWithPlayerItem(newItem)需要时调用。

例如,您可以这样做UITableView.cellForRowAtIndexPath(indexPath)。你也可以AVPlayer.replaceCurrentItemWithPlayerItem(nil)在你的UITableViewCell.prepareForReuse()

这可能看起来有点棘手,但这里没有必要删除任何东西;)

希望这会有所帮助!

于 2015-07-20T09:06:48.007 回答