Ich benutze Sprite Kit und einen SKVideoNode, um ein kurzes Video abzuspielen. Wenn der Videoknoten der Szene hinzugefügt wird, sei es vor oder nach der Ersteinrichtung, blinkt der Player für kurze Zeit schwarz.Das Abspielen von Video in einem SKVideoNode verursacht einen schwarzen Blitz, bevor die Wiedergabe beginnt.
Ich habe versucht, einen AVPlayer für das Video anstelle des Videos direkt zu verwenden, auch habe ich KVO verwendet, um nur den SKVideoNode zu laden, wenn das Video sagt, dass es bereit ist zu spielen.
In jedem Fall erhalte ich einen schwarzen Blitz, bevor mein Video abgespielt wird.
Auch scheint es keine Möglichkeit zu geben, einen AVPlayerLayer zu SKScene/SKView hinzuzufügen, obwohl ich nicht weiß, ob das helfen würde.
Alle Vorschläge, was als nächstes zu versuchen wäre großartig.
Hier ist der Code, den ich mit
- (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];
}
}
Hier ist ein alternatives Stück Code, der gerade das Video spielt und gibt den gleichen schwarzen Blitz zwischen dem Video geladen und es zu spielen.
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];
wo skvideonode initialisiert wird? Kannst du den Code von skvideonode eingeben? – Ilario
Hinzugefügt den Code, wo ich es verwende. Ich habe versucht, den Preroll-Code, wie Sie sehen werden, und das machte keinen Unterschied zu den Dingen. –
wo rufe [introVideo abspielen]? – Ilario