1

我只想要一个连续循环的视频。我这样设置播放器:

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

通知方法只是有人在这里建议的一种技巧:iOS 中的平滑视频循环

我有两个问题。视频循环仍然不是无缝的。循环之间有一个非常明显的停顿。其次,视频在任意循环次数后停止循环。通常在 2-4 个循环之间变化。这显然是我的应用程序的一个大问题。播放器真的有这么多问题还是我做错了什么?

4

2 回答 2

0

我在这里为视频创建了一个完整的无缝循环解决方案seamless-video-looping-on-ios。随意下载示例 xcode 应用程序并亲自尝试以了解我的方法。我发现 MPMoviePlayerController 和 AVPlayer 都不能用于这种类型的事情。

于 2013-06-19T07:08:19.697 回答
-1

我也无法获得无缝循环使用MPMoviePlayerController——总是至少有 0.5 秒的黑色,并且偶尔会闪现 QuickTime 标志。

但是,我可以使用以下方法获得无间隙循环AVPlayer- 但需要几个条件才能实现:

  1. 关于我的测试视频剪辑的编码意味着寻找开头总是会在每个循环开始时导致大约 0.5 秒的暂停。以kCMTimeZero容差将 1 秒插入剪辑使其无缝。如果没有显式的零查找容差,效果与查找到剪辑的开头相同。

  2. 不玩而求是飘忽不定;它会导致我的 iPhone 4 挂起,但不会导致我的 iPad 3 挂起。两个替代修复(如下#if所示)是:

    1. 在再次调用之前等待搜索完成play,或者

    2. 等到特定时间(剪辑结束之前),然后从开头重新开始播放。

以下代码实现了这两个条件:

  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
于 2012-07-22T15:31:10.140 回答