我只想要一个连续循环的视频。我设置了这样的播放器:
self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:someURL];
self.moviePlayer.controlStyle = MPMovieControlStyleNone;
self.moviePlayer.shouldAutoplay = YES;
self.moviePlayer.repeatMode = MPMovieRepeatModeOne;
self.moviePlayer.view.frame = self.container.frame;
[self.container addSubview:self.moviePlayer.view];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(moviePlayBackDidFinish:) name: MPMoviePlayerPlaybackStateDidChangeNotification
object: self.moviePlayer];
- (void) moviePlayBackDidFinish:(NSNotification*)notification {
NSLog( @"myMovieFinishedCallback: %@", notification );
MPMoviePlayerController *movieController = notification.object;
NSLog( @"player.playbackState = %d", movieController.playbackState );
}
通知方法只是某人在此建议的黑客攻击:Smooth video looping in iOS
我有两个问题。视频循环仍然不是无缝的。循环之间有一个非常明显的暂停。其次,视频在任意数量的循环后停止循环。通常在2-4个循环之间变化。这显然是我的应用程序的一个大问题。玩家真的是这辆车还是我做错了什么?
答案 0 :(得分:0)
我在这里seamless-video-looping-on-ios为视频创建了一个完整的无缝循环解决方案。随意下载示例xcode应用程序并亲自尝试看看我的方法。我发现MPMoviePlayerController和AVPlayer都无法用于此类事情。
答案 1 :(得分:-1)
我也无法使用MPMoviePlayerController
进行无间隙循环 - 总有至少0.5秒的黑色,以及偶尔闪现的QuickTime徽标。
但是,我可以使用AVPlayer
获得无间隙循环 - 但需要几个条件才能实现:
关于我的测试视频片段编码的一些事情意味着在每个循环开始时寻找开头总是会导致约0.5秒的暂停。在具有kCMTimeZero
容差的剪辑中寻找1s使其无缝。如果没有明确的零搜索容差,则效果与搜索剪辑的开头相同。
在不玩的时候寻求不稳定;它导致我的iPhone 4挂起,而不是我的iPad 3.两个替代修复(在下面显示为#if
),是:
在再次致电play
之前等待寻求完成,或
等到特定时间(剪辑结束前),然后在开头重新开始播放。
以下代码实现了这两个条件:
self.player = [AVPlayer playerWithURL:url];
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
self.playerLayer.frame = self.view.bounds;
[self.view.layer addSublayer:self.playerLayer];
[self.player seekToTime:CMTimeMakeWithSeconds(1, 1) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
[self.player play];
#if 1
[[NSNotificationCenter defaultCenter] addObserverForName:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
[self.player seekToTime:CMTimeMakeWithSeconds(1, 1) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
[self.player play];
}];
}];
#endif
#if 0
NSArray *times = [NSArray arrayWithObject:[NSValue valueWithCMTime:CMTimeMake(5, 1)]];
[self.player addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{
[self.player seekToTime:CMTimeMakeWithSeconds(1, 1) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
}];
#endif