Vine like table view cells 开始播放视频总是很慢

Vine like table view cells starts playing video always slowly

我正在开发一个与 Vine 应用程序具有类似提要的应用程序。我使用 MPMoviePlayerController 在 UITableviewcells 中播放视频。我已经使用 MPMoviePlayerController 创建了一个自定义 tableview 单元格,现在从包中加载了一个示例测试视频。为了在单元格可见时自动播放视频,我使用了以下代码。

- (FMVideoTableViewCell *)detectCenterCell
{
    // Returns the FMVideoTableViewCell at the center of the screen.
    // Assuming the center point to be (width/2,height/2).

    return (FMVideoTableViewCell *)[self.tableView cellForRowAtIndexPath:[self findIndexPathForCellAtLocation:self.tableView.frame.size.width / 2 and:self.tableView.frame.size.height / 2]];
}

上面的函数returns当前可见的单元格,我在下面的滚动视图委托中调用了这个函数。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

除此之外,我还使用以下方法停止在 UITableview 的不可见单元格中播放视频。

- (FMVideoTableViewCell *)detectTopCell
{
    // Returns the FMVideoTableViewCell which touches the top frame of the TableView.
    // Assuming the top point to be (10,10).

    return (FMVideoTableViewCell *)[self.tableView cellForRowAtIndexPath:[self findIndexPathForCellAtLocation:10 and:10]];
}

- (FMVideoTableViewCell *)detectBottomCell
{
    // Returns the FMVideoTableViewCell which touches the bottom frame of the TableView.
    // Assuming the bottom point to be (width/2,height).

    return (FMVideoTableViewCell *)[self.tableView cellForRowAtIndexPath:[self findIndexPathForCellAtLocation:self.tableView.frame.size.width / 2 and:self.tableView.frame.size.height]];
}

滚动 Tableview 时一切如我所料,没有卡住。我现在面临的唯一一个问题是 MPMovieplayer 开始播放视频有延迟。我试过 prepareToPlay 属性 来消除这个初始延迟。但这会导致 Tableview 单元格在滚动时出现一些黑屏,也会降低 Tableview 滚动的流畅度。然后我寻找替代解决方案,在 tableview 的速度下降时开始播放视频,而无需等待 Scrollview 代表触发。为此,我使用了以下代码。

    static double prevCallTime = 0;
    static double prevCallOffset = 0;

    //Simple velocity calculation
    double curCallTime = CACurrentMediaTime();
    double timeDelta = curCallTime - prevCallTime;
    double curCallOffset = self.tableView.contentOffset.y;
    double offsetDelta = curCallOffset - prevCallOffset;
    double velocity = fabs(offsetDelta / timeDelta);
    NSLog(@"Velocity: %f", velocity);

    if(velocity < 500 && velocity > 50)
    {
        [self preLoadVideo];
    }

    prevCallTime = curCallTime;
    prevCallOffset = curCallOffset;

scrollViewDidEndDragging 只有在结束 tableview 滚动后才会被触发。因此,为了在不等待 tableview 滚动结束的情况下开始播放视频,我在 scrollViewWillEndDragging 中尝试了相同的操作。但是 scrollViewWillEndDragging 和 scrollViewDidEndDragging 之间的时间差是可以协商的。所以我尝试了另一种方法来调用 tableview willDisplayCell 委托中的视频播放操作。

但这也没有帮助我减少播放器开始播放的初始时间。请帮我解决这个问题。提前致谢。

最后我用AVPlayer替换MPMoviePlayer成功实现了vine like video listing。与 MPMoviePlayer 相比,我认为 AVPlayer 是一个轻量级播放器。它还允许我们同时播放多个视频。