xcode – currentPlaybackTime和NSTimer在视频播放期间启动视图,
发布时间:2020-12-14 17:27:02 所属栏目:百科 来源:网络整理
导读:在这里苦苦挣扎…… 我试图在视频时间轴的特定时段显示视图,在触发下一个视图时替换.我已经设法做了很多 – 我的问题是这只是以线性方式发生,如果播放头被移回到已被触发的视图(即该点之前的任何内容),则计时器继续,但触发器不再开火 任何帮助将不胜感激!这
在这里苦苦挣扎……
我试图在视频时间轴的特定时段显示视图,在触发下一个视图时替换.我已经设法做了很多 – 我的问题是这只是以线性方式发生,如果播放头被移回到已被触发的视图(即该点之前的任何内容),则计时器继续,但触发器不再开火 任何帮助将不胜感激!这是代码…… - (void)viewDidLoad { [super viewDidLoad]; keyframeTimes = [[NSMutableArray alloc] init]; shoutOutTexts = [[NSArray arrayWithObjects:@"This is a testnLabel at 2 secs ",@"This is a testnLabel at 325 secs",nil] retain]; shoutOutTimes = [[NSArray arrayWithObjects:[[NSNumber alloc] initWithInt: 2],[[NSNumber alloc] initWithInt: 325],nil] retain]; self.player = [[MPMoviePlayerController alloc] init]; self.player.contentURL = [self movieURL]; // END:viewDidLoad1 self.player.view.frame = self.viewForMovie.bounds; self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.viewForMovie addSubview:player.view]; [self.player play]; // START_HIGHLIGHT [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerAction:) userInfo:nil repeats:YES]; // END_HIGHLIGHT // START:viewDidLoad1 [self.view addSubview:self.myScrollView]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieDurationAvailable:) name:MPMovieDurationAvailableNotification object:nil]; } // END:viewDidLoad // END:viewDidLoad1 // START:movieURL -(NSURL *)movieURL { NSBundle *bundle = [NSBundle mainBundle]; NSString *moviePath = [bundle pathForResource:@"BigBuckBunny_640x360" ofType:@"m4v"]; if (moviePath) { return [NSURL fileURLWithPath:moviePath]; } else { return nil; } } // END:movieURL int position = 0; - (void)timerAction:(NSTimer*)theTimer { NSLog(@"hi"); int count = [shoutOutTimes count]; NSLog(@"count is at %d",count); if (position < count) { NSNumber *timeObj = [shoutOutTimes objectAtIndex:position]; int time = [timeObj intValue]; NSLog(@"time is at %d",time); if (self.player.currentPlaybackTime >= time) { CommentView *cview = [[CommentView alloc] initWithText:[shoutOutTexts objectAtIndex:position]]; [self.player.view addSubview:cview]; position++; [NSTimer scheduledTimerWithTimeInterval:4.0f target:self selector:@selector(removeView:) userInfo:cview repeats:NO]; } } } - (void)removeView:(NSTimer*)theTimer { UIView *view = [theTimer userInfo]; [view removeFromSuperview]; } 这是日志调用直到…… 这是日志调用…… 2011-04-23 11:53:44.370 MoviePlayer[17129:207] last check was at 7.76279 2011-04-23 11:53:44.371 MoviePlayer[17129:207] current playback time is 8.76292 2011-04-23 11:53:44.371 MoviePlayer[17129:207] shouting: This is a test Label at 2 secs 2011-04-23 11:53:45.368 MoviePlayer[17129:207] position is at 2 2011-04-23 11:53:45.369 MoviePlayer[17129:207] shout scheduled for 8 2011-04-23 11:53:45.370 MoviePlayer[17129:207] last check was at 8.76451 2011-04-23 11:53:45.371 MoviePlayer[17129:207] current playback time is 9.76299 解决方法
这是因为位置是一个静态变量,你总是提高它但从不降低它.
您需要稍微改变计时器功能中的逻辑 – 也许这样; 从源中删除静态变量位置(int position = 0;) - (NSInteger)positionFromPlaybackTime:(NSTimeInterval)playbackTime { NSInteger position = 0; for (NSNumber *startsAt in shoutOutTimes) { if (playbackTime > [startsAt floatValue]) { ++position; } } return position; } 添加一个静态变量(实际上一个实例变量会更干净但是嘿,我们只是想让它在这个时候工作): NSTimeInterval lastCheckAt = -1.0; 然后将您的计时器方法更改为: - (void)timerAction:(NSTimer*)theTimer { int count = [shoutOutTimes count]; NSInteger position = [self positionFromPlaybackTime:self.player.currentPlaybackTime]; NSLog(@"position is at %d",position); if (position > 0) { --position; } if (position < count) { NSNumber *timeObj = [shoutOutTimes objectAtIndex:position]; int time = [timeObj intValue]; NSLog(@"shout scheduled for %d",time); NSLog(@"last check was at %g",lastCheckAt); NSLog(@"current playback time is %g",self.player.currentPlaybackTime); if (lastCheckAt < time && self.player.currentPlaybackTime >= time) { NSString *shoutString = [shoutOutTexts objectAtIndex:position]; NSLog(@"shouting: %@",shoutString); CommentView *cview = [[CommentView alloc] initWithText:shoutString]; [self.player.view addSubview:cview]; [NSTimer scheduledTimerWithTimeInterval:4.0f target:self selector:@selector(removeView:) userInfo:cview repeats:NO]; } } lastCheckAt = self.player.currentPlaybackTime; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |