【发布时间】:2014-05-02 05:02:57
【问题描述】:
我正在使用 Sprite Kit 和 SKVideoNode 播放一个短视频。当视频节点添加到场景中时,无论是在初始设置之前还是之后,播放器都会短暂闪烁黑色。
我尝试使用 AVPlayer 来播放视频而不是直接播放视频,我还使用 KVO 仅在视频显示可以播放时加载 SKVideoNode。
无论哪种方式,我都会在视频开始播放之前出现黑色闪光。
似乎也没有办法将 AVPlayerLayer 添加到 SKScene/SKView,尽管我不知道这是否会有所帮助。
任何关于下一步尝试的建议都会很棒。
这是我正在使用的代码
- (void)didMoveToView:(SKView *)view
{
if (!self.contentCreated) {
[self createSceneContents];
}
}
- (void)createSceneContents
{
NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"IntroMovie" ofType:@"mov"];
NSURL *introVideoURL = [NSURL fileURLWithPath:resourcePath];
self.playerItem = [AVPlayerItem playerItemWithURL:introVideoURL];
self.player = [[AVPlayer alloc] initWithPlayerItem:self.playerItem];
[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
SKSpriteNode *playButton = [SKSpriteNode spriteNodeWithImageNamed:@"PlayButton"];
[playButton setPosition:CGPointMake(CGRectGetMidX(self.view.frame), (CGRectGetMidY(self.view.frame) / 5) * 3)];
[self addChild:playButton];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"status"]) {
if ([[change objectForKey:NSKeyValueChangeNewKey] integerValue] == AVPlayerItemStatusReadyToPlay) {
NSLog(@"Change has the following %@", change);
[self.player prerollAtRate:0 completionHandler:^(BOOL done){
SKVideoNode *introVideo = [SKVideoNode videoNodeWithAVPlayer:self.player];
[introVideo setSize:CGSizeMake(self.size.width, self.size.height)];
[introVideo setPosition:self.view.center];
[self addChild:introVideo];
[introVideo play];
[self.playerItem removeObserver:self forKeyPath:@"status"];
}];
}
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
这是一段替代代码,它只播放视频,并在加载视频和播放视频之间提供相同的黑色闪光。
NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"IntroMovie" ofType:@"m4v"];
NSURL *introVideoURL = [NSURL fileURLWithPath:resourcePath];
self.playerItem = [AVPlayerItem playerItemWithURL:introVideoURL];
self.player = [[AVPlayer alloc] initWithPlayerItem:self.playerItem];
SKVideoNode *introVideo = [SKVideoNode videoNodeWithAVPlayer:self.player];
[introVideo setSize:CGSizeMake(self.size.width, self.size.height)];
[introVideo setPosition:self.view.center];
[self addChild:introVideo];
[introVideo play];
【问题讨论】:
-
skvideonode 在哪里初始化?你能发布skvideonode的代码吗?
-
在我使用它的地方添加了代码。如您所见,我尝试了预卷代码,这对事情没有任何影响。
-
在哪里调用[introVideo play]?
-
对不起,我在测试其他东西时删除了它。在添加节点之后。我已将其添加回代码中。我也尝试过事先启动它,但结果还是一样。
-
为什么使用观察者?您可以在 initWithSize 中加载视频,然后使用全局变量 SKVideoNode *_introVideo 您可以从任何地方播放视频
标签: sprite-kit avplayer skvideonode