我使用AVPlayer
与SKVideoNode
附加到一个场景。这是SKScene
的唯一节点。我正在播放这个视频,其中夹杂着一组其他加载了各种SKSpriteNode
节点的场景。
我想预滚动AVPlayer
,以便视频在SKScene
过渡期间变得可见之前(或作为)已经开始播放。然而,如果没有黑色闪光的介入,我似乎无法做到这一点。
就在包含视频的场景消失时,我重置了它(我将AVPlayer对象填充到SKVideoNode
的用户字典中)。这似乎可以工作:
SKVideoNode *v = ...;
AVPlayer *player = [[v userData] objectForKey:@"AVPlayer"];
if ([player isKindOfClass:[AVPlayer class]]) {
[player seekToTime:kCMTimeZero];
当包含视频的场景即将出现时,我这样做:
SKTransition *trans = [SKTransition flipHorizontalWithDuration:1.0];
[self.skView presentScene:theScene transition:trans];
[self performSelector:@selector(startVideoInScene:)
withObject:theScene
afterDelay:0.2];
然后……
- (BOOL)startVideoInScene:(SKScene *)theScene
{
for (SKNode *n in [theScene children])
if ([n isKindOfClass:[SKVideoNode class]]) {
SKVideoNode *v = (SKVideoNode *)n;
AVPlayer *player = [[v userData] objectForKey:@"AVPlayer"];
if ([player isKindOfClass:[AVPlayer class]]) {
[v play];
return YES;
}
}
return NO;
}
如果在视频开始前没有短时间的黑色,则无法工作。
有人成功了吗?
我有一个挥之不去的怀疑,SKScene
上的所有内容在过渡期间都被暂停了,而且没有办法。嗯,除了过渡出当前场景的所有节点,保持当前场景,并将一个新的SKVideoNode
过渡到它上面。
这个问题的答案建议从视频的第一帧制作静止图像,并使SKSpriteNode
用作首先出现在场景过渡中的图像。然后,当过渡结束时,隐藏海报图像(SKSpriteNode
)并播放视频。
现在,我正在做的一个项目,实际上是利用黑色对我有利。游戏的背景允许我这么做,但我基本上让场景过渡到黑色,视频的开始(在我的例子中是mp4)有一个黑色的开始,然后随着视频播放从黑色淡入。