像表格视图单元格一样的藤蔓开始播放视频总是很慢
Posted
技术标签:
【中文标题】像表格视图单元格一样的藤蔓开始播放视频总是很慢【英文标题】:Vine like table view cells starts playing video always slowly 【发布时间】:2015-02-09 12:30:49 【问题描述】:我正在开发一个具有类似提要的应用程序,例如 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]];
上面的函数返回当前可见单元格,我在下面的滚动视图委托中调用了这个函数。
- (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 委托中的视频播放操作。
但这也没有帮助我减少玩家开始游戏的初始时间。请帮我解决这个问题。提前致谢。
【问题讨论】:
【参考方案1】:最后我通过用 AVPlayer 替换 MPMoviePlayer 成功实现了 vine like 视频列表。与 MPMoviePlayer 相比,我认为 AVPlayer 是一个轻量级的播放器。它还允许我们同时播放多个视频。
【讨论】:
嗨,你能分享你的代码吗,你如何像 Vine 一样播放视频,我也在尝试做同样的事情,但没有成功...... 嗨 ravinder,我不能分享完整的代码,因为它有点复杂。我将与您分享一些特定功能的内容,例如在单元格可见时播放、设置单元格的来源等。您能说说您卡在哪一部分吗? 嗨毗湿奴,实际上,当我设置自动播放时,是的,比它播放 2-3 个单元格,我只想播放可见单元格。 滚动结束时需要检测中心单元格并通知该单元格可见。在该函数内部开始调用视频播放函数。使用m3u8流式视频提升性能,否则启动视频播放会有一点延迟。 嗨,毗湿奴,如果可能,请提供详细代码,我尝试了很多但无法找到确切的解决方案。以上是关于像表格视图单元格一样的藤蔓开始播放视频总是很慢的主要内容,如果未能解决你的问题,请参考以下文章