【问题标题】:Problems with MPMoviePlayerController loopingMPMoviePlayerController 循环的问题
【发布时间】:2012-07-18 22:27:44
【问题描述】:

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

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 个循环之间变化。这显然是我的应用程序的一个大问题。播放器真的有这个问题还是我做错了什么?

【问题讨论】:

  • 是的,我相信播放器有很多问题(尤其是在播放开始时)。也就是说,您可能想在您链接到的问题中尝试@cmatsumoto 的回答。

标签: ios mpmovieplayercontroller


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我也无法使用MPMoviePlayerController 进行无间隙循环——总是至少有 0.5 秒的黑色,并且 QuickTime 徽标偶尔会闪烁。

    但是,我可以使用AVPlayer 获得无间隙循环——不过,它需要几个条件才能实现:

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

    2. 在不玩的时候寻找是不稳定的;它会导致我的 iPhone 4 挂起,但不会导致我的 iPad 3 挂起。两个替代修复(如下所示#if'ed)是:

      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
    

    【讨论】:

    • 在 iOS 4 到 6 上对我来说不是无缝循环。两个选项都试过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    相关资源
    最近更新 更多