在iOS中平滑视频循环

时间:2011-10-19 14:25:22

标签: ios mpmovieplayercontroller ios5 movie avplayer

有人能建议一种方法,通过这种方法可以在iOS中实现视频剪辑的完全平滑无缝循环吗?我尝试了两种方法,当视频循环

时,这两种方法都会产生一个小暂停

1)AVPlayerLayer与playerItemDidReachEnd通知设置关闭seekToTime:kCMTimeZero

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

2)带有setRepeatMode的MPMoviePlayerController:MPMovieRepeatModeOne

这会导致较小的暂停,但仍然不完美。

我不知道从哪里开始。任何人都可以提出一个灵魂吗?

5 个答案:

答案 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];