我有一个UITableViewCell。它有2个AVPlayers,2个AVPlayerItem和2个AVPlayerLayers。一个AVPlayer及其内容位于单元格的右侧,一个位于单元格的左侧。我正在使用AVAssetResourceLoader同时缓存和播放视频。这很好用,除了第二个视频不显示。它确实正确缓存,因为在滚动tableview后,它会从缓存中正确播放。但只是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,正确的activityID,并下载/缓存正确的视频 - 除了视频在下载时不播放。我改变了背景颜色,我可以确认AVPlayerLayer确实存在于它应该是的帧中。只是没有视频出现。
我尝试切换左右视频和下载顺序 - 在这种情况下,播放了正确的视频,左视频没有播放。基本上,无论哪个视频必须使用此计时器并不断检查下载是否正在进行,视频是否显示不正确,这让我觉得这是关于范围/传递变量的计时器我做错了
最后一个细节,如果有帮助的话。如果我说以下(而不是我在这里的第一种方法):
if (self.downloadInProgress) {
[self playStreamingVideoOnRightInCell:videoCell withActivity:activity2];
}
然后,playerLayer会显示视频 - 但这是错误的视频。它显示与单元格左侧相同的视频。
这是调试的噩梦,我现在相当肯定它与使用计时器来播放视频而不是在常规范围内进行操作有关。任何人都有任何想法,我可能做错了吗?
答案 0 :(得分:1)
为了修复正确的视频播放,您需要更改以下内容。您使用NSNumber
值而不是BOOL
作为left
值。
您的代码:
BOOL left = [[timer userInfo] objectForKey:@"left"];
应该是:
BOOL left = [[[timer userInfo] objectForKey:@"left"] boolValue];