2011-10-19 43 views
5

任何人都可以提出一种方法,通过它可以在iOS中实现完全平滑无缝的视频剪辑循环?我已经尝试了两种方法,两种方法都产生一个小小的停顿当视频循环iOS中流畅的视频循环

1)AVPlayerLayer与playerItemDidReachEnd通知掀起seekToTime:kCMTimeZero

我更喜欢使用AVPlayerLayer(其他原因),但这种方法会在循环之间产生明显的停顿。

2)的MPMoviePlayerController与setRepeatMode:MPMovieRepeatModeOne

这导致较小的停顿,但它仍然是不完美的。

我不确定该从哪里出发。任何人都可以提出灵魂吗?

+0

哇,没有反应。我想这在iOS中绝对不是一件容易的事情。我正在研究一个涉及两个交替AVPlayers的解决方法,但这只是一个解决方法。仍然希望有一种方法可以顺利地循环一个剪辑。 – one09jason

+0

运气好吗?我现在也正在处理这个问题。我得到循环之间的跳转以及5-6循环后视频永久冻结。 – brandon

+0

我也遇到过使用setRepeatMode:MPMovieRepeatModeOne在多个循环后出现冻结的问题 –

回答

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的非循环的问题对我来说太。

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]; 
     } 
    } 
} 

苹果做了一些大的变化如何MPMoviePlaye rController处理加载电影文件时,他们从iOS 4更改为iOS 5,所以我不知道这种方法将工作时,他们释放iOS 6

0

我调查了原始海报报道的相同问题(打破无缝性的循环中的小暂停)。通过运气,我有另一个视频样本,没有这种行为,并找到了解释/不同后来才发现:

声轨。

我怀疑是一个非常慢的声音初始化(路由?)。

删除声轨对我来说是最简单的方法(不需要的声音),但我将不得不进一步挖掘(音频混音选项和测试已张贴在这个线程解决方案)。

埃里克

-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]; 
+0

链接断开,也建议解决方案无法实现真正​​的无缝循环。 – MoDJ