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 つの問題があります。ビデオのループはまだシームレスではありません。ループ間に非常に顕著な一時停止があります。次に、任意の回数のループの後、ビデオのループが停止します。通常、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 秒の一時停止が発生することを意味します。許容範囲内でクリップを 1 にシークすると、kCMTimeZeroシームレスになります。明示的なゼロ シーク許容範囲がない場合、効果はクリップの先頭をシークするのと同じです。

  2. プレイしていないときのシークは不安定です。iPhone 4 ではハングアップしますが、iPad 3 ではハングアップしません。別の 2 つの修正方法 (以下に示し#ifます) は次のとおりです。

    1. play再度呼び出す前にシークが完了するのを待つか、

    2. 特定の時間 (クリップの終了前) まで待ってから、最初から再生を再開します。

次のコードは、これら 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 に答える