【发布时间】:2016-04-28 16:01:01
【问题描述】:
我有一个 UITableViewCell。它有 2 个 AVPlayer、2 个 AVPlayerItems 和 2 个 AVPlayerLayers。一个 AVPlayer 及其内容位于单元格的右侧,一个位于单元格的左侧。我正在使用 AVAssetResourceLoader 同时缓存和播放视频。这很好用,除了第二个视频不显示。它确实可以正确缓存,因为在滚动表格视图后,它可以从缓存中正确播放。但只是 AVPlayerLayer 并没有按应有的方式显示视频内容。
AVAssetResourceLoader 无法同时处理 2 个下载。首次加载 tableview 时,左侧的视频开始下载/播放。右侧的视频播放代码紧跟在左侧的视频下载/播放代码之后——当然,这意味着下载过程还没有完成。为了解决这个问题,我创建了一个计时器,如下所示:
if (self.downloadInProgress) {
// download is in progress. wait to start next download
self.downloadQueueCount++;
NSDictionary *videoSettings = @{@"id": activity2.objectId,
@"activity": activity2, @"cell": videoCell, @"left": @NO}
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.2
target:self selector:@selector(DownloadNextVideo:)
userInfo:videoSettings repeats:YES];
} else {
[self playStreamingVideoOnRightInCell:videoCell withActivity:activity2];
}
然后是选择器方法:
- (void)DownloadNextVideo:(NSTimer *)timer {
if (self.downloadInProgress == NO) {
NSString *activityId = [[timer userInfo] objectForKey:@"id"];
self.videoChallengeID1 = activityId;
CompletedTableViewCell *videoCell = (CompletedTableViewCell *)[[timer userInfo]objectForKey:@"cell"];
Activity *activity = [[timer userInfo] objectForKey:@"activity"];
BOOL left = [[timer userInfo] objectForKey:@"left"];
[self.timer invalidate];
if (left) {
[self playStreamingVideoOnLeftInCell:videoCell withActivity:activity];
} else {
[self playStreamingVideoOnRightInCell:videoCell withActivity:activity];
}
}
}
基本上,这可以正常工作——AVAssetResourceLoader 获取正确的 URL、正确的活动 ID,并下载/缓存正确的视频——除了视频在下载时不播放。我更改了背景颜色,我可以确认 AVPlayerLayer 确实存在于它应该存在的框架中。只是没有视频显示。
我尝试切换左右视频并下载顺序 - 在这种情况下,右侧的视频播放,而左侧的视频没有播放。基本上,无论哪个视频必须使用此计时器并不断检查是否正在进行下载,视频是否无法正确显示,这让我认为这是我在使用有关范围/传递变量的计时器时做错的事情.
最后一个细节,以防万一。如果我说以下(而不是我在这里的第一种方法):
if (self.downloadInProgress) {
[self playStreamingVideoOnRightInCell:videoCell withActivity:activity2];
}
然后,playerLayer 确实显示了视频,但这是错误的视频。它显示与单元格左侧相同的视频。
这对调试来说是一场噩梦,在这一点上我相当肯定它与在此处使用计时器播放视频而不是在常规范围内播放视频有关。有人知道我做错了什么吗?
【问题讨论】:
标签: ios uitableview avfoundation nstimer avplayer