有人能建议一种方法,通过这种方法可以在iOS中实现视频剪辑的完全平滑无缝循环吗?我尝试了两种方法,当视频循环
时,这两种方法都会产生一个小暂停1)AVPlayerLayer与playerItemDidReachEnd通知设置关闭seekToTime:kCMTimeZero
我更喜欢使用AVPlayerLayer(出于其他原因),但是这种方法会在循环之间产生明显的暂停。
2)带有setRepeatMode的MPMoviePlayerController:MPMovieRepeatModeOne
这会导致较小的暂停,但仍然不完美。
我不知道从哪里开始。任何人都可以提出一个灵魂吗?
答案 0 :(得分:3)
我可以同意@ SamBrodkin的调查结果。
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(myMovieFinishedCallback:)
name: MPMoviePlayerPlaybackStateDidChangeNotification
object: m_player];
和
-(void) myMovieFinishedCallback: (NSNotification*) aNotification
{
NSLog( @"myMovieFinishedCallback: %@", aNotification );
MPMoviePlayerController *movieController = aNotification.object;
NSLog( @"player.playbackState = %d", movieController.playbackState );
}
也为我修复了iOS 5上的非循环问题。
答案 1 :(得分:2)
我刚刚在我的iPad 3上运行iOS 5.1.1,基础SDK iOS 5.1
设置电影播放器时,请将重复模式设置为MPMovieRepeatModeNone 然后添加通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayerDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:self.moviePlayer];
然后设置选择器以在电影播放完毕后进行过滤
- (void)moviePlayerDidFinish:(NSNotification *)note {
if (note.object == self.moviePlayer) {
NSInteger reason = [[note.userInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] integerValue];
if (reason == MPMovieFinishReasonPlaybackEnded) {
[self.moviePlayer play];
}
}
}
Apple对MPMoviePlayerController在从iOS 4更改为iOS 5时如何处理加载电影文件方面做了一些大的改动,所以我不知道这个方法在发布iOS 6时是否会起作用
答案 2 :(得分:1)
要查看显示背景视频(来自动画GIF)的无缝循环以及在一对前景角色动画(使用Alpha通道)之间切换的示例,请查看seamless-video-looping-on-ios。我过去曾尝试过使用AVPlayer而不得不放弃与AVPlayer相关的解决方案,因为它们运行得不够好。请参阅此SO问题iphone-smooth-transition-from-one-video-to-another。
答案 3 :(得分:0)
我调查了原始海报所报告的相同问题(循环中的小停顿打破了无缝性)。幸运的是,我有另一个没有这种行为的视频样本,并且稍后才发现解释/不同:
音轨。
我怀疑声音初始化很慢(路由?)。
删除音轨对我来说是最简单的解决方案(不需要声音)但我必须进一步挖掘(音频混音选项并测试已在此主题中发布的解决方案)。
埃里克
答案 4 :(得分:-1)
为了避免视频重绕时的差距,在合成中使用同一资产的多个副本对我来说效果很好。
AVURLAsset *tAsset = [AVURLAsset assetWithURL:tURL];
CMTimeRange tEditRange = CMTimeRangeMake(CMTimeMake(0, 1), CMTimeMake(tAsset.duration.value, tAsset.duration.timescale));
AVMutableComposition *tComposition = [[[AVMutableComposition alloc] init] autorelease];
for (int i = 0; i < 100; i++) { // Insert some copies.
[tComposition insertTimeRange:tEditRange ofAsset:tAsset atTime:tComposition.duration error:nil];
}
AVPlayerItem *tAVPlayerItem = [[AVPlayerItem alloc] initWithAsset:tComposition];
AVPlayer *tAVPlayer = [[AVPlayer alloc] initWithPlayerItem:tAVPlayerItem];