在场景转换之前预先播放带AVPlayer的SKVideoNode?

时间:2014-03-25 18:32:15

标签: sprite-kit skscene skvideonode

我使用的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转换到它上面。

1 个答案:

答案 0 :(得分:1)

来自this question的答案建议从视频的第一帧制作静止图像,并使其成为SKSpriteNode,用作首次显示为场景转换的图像。然后,当转换结束时,隐藏该海报图片(SKSpriteNode)并播放您的视频。

现在,我现在正在进行的项目中,实际上正在使用黑色对我有利。游戏的上下文允许我这样做,但我基本上让我的场景转换为黑色,视频的开头(在我的情况下是mp4)有黑色开始,然后在视频播放时从黑色淡入。