sprite kit - Playing back video in an SKVideoNode causes a black flash before playback begins -
i'm using sprite kit , skvideonode play short video. when video node added scene, before of after initial set up, player flashes black brief second.
i have tried using avplayer video instead of video directly, i've used kvo load skvideonode when video says it's ready play.
either way black flash before video starts play.
also there doesn't seem way add avplayerlayer skscene/skview, although don't know if help.
any suggestions on try next great.
here's code i'm using
- (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 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]; } }
here's alternative piece of code plays video , gives same black flash between video being loaded , playing.
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];
i had similar problem , solved this:
i exported first frame of video png. added skspritenode
png in front of skvideonode
. when start video, set hidden
property of skspritenode
yes
.
here simplified example of code relevant parts:
-(void)didmovetoview:(skview *)view { // add first frame on top of skvideonode firstframe = [skspritenode spritenodewithimagenamed:@"firstframe"]; firstframe.zposition = 1; [self addchild:firstframe]; // here add skvideonode avplayer ...... // add kvo [playeritem addobserver:self forkeypath:@"status" options:nskeyvalueobservingoptionnew context:nil]; } - (void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary *)change context:(void *)context { if (object == player.currentitem && [keypath isequaltostring:@"status"]) { if (player.currentitem.status == avplayeritemstatusreadytoplay) { [introvideo play]; firstframe.hidden = yes; } } }
best solution i've found far. hope helps you!
Comments
Post a Comment