我正在开发一款类似Feed应用的应用。我使用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]];
}
上面的函数返回当前的可见单元格,我在下面的scrollview委托中调用了这个函数。
- (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;
只有在结束tableview滚动后才会触发scrollViewDidEndDragging。因此,要在不等待tableview滚动结束的情况下启动视频播放,我在scrollViewWillEndDragging中尝试了相同的操作。但scrollViewWillEndDragging和scrollViewDidEndDragging之间的时差是可以协商的。所以我尝试了另一种方法来调用tableview中的视频播放动作willDisplayCell委托。
但这也没有帮助我减少玩家开始玩的初始时间。请帮我解决这个问题。提前谢谢。
答案 0 :(得分:1)
最后,我通过用AVPlayer替换MPMoviePlayer成功实现了像视频列表一样的藤蔓。我认为与MPMoviePlayer相比,AVPlayer是一个轻量级的播放器。它还允许我们同时播放多个视频。