2011-10-19 24 views
5

Czy ktoś może zaproponować metodę, dzięki której można uzyskać całkowicie płynne i płynne zapętlenie klipu wideo w systemie iOS? Próbowałem na dwa sposoby, z których oba wytwarzają małą pauzę, gdy wideo pętlePłynna pętla wideo w iOS

1) AVPlayerLayer z ustawieniem powiadomienie playerItemDidReachEnd off seekToTime: kCMTimeZero

Wolę używać AVPlayerLayer (z innych powodów), ale ta metoda daje zauważalną pauzę około jednej sekundy między pętlami.

2) MPMoviePlayerController z setRepeatMode: MPMovieRepeatModeOne

Skutkuje to mniejszym przerwie, ale to wciąż nie jest doskonały.

Nie jestem pewien, dokąd się udać. Czy ktoś może zaproponować duszę?

+0

Wow, brak odpowiedzi. Wydaje mi się, że nie jest to łatwe w przypadku iOS. Pracuję nad obejściem, które obejmuje dwa naprzemiennie odtwarzacze AVP, ale jest to tylko obejście. Nadal mam nadzieję, że istnieje sposób na płynne zapętlenie jednego klipu. – one09jason

+0

Powodzenia? W tej chwili też zajmuję się tym problemem. Przeskakuję między pętlami, a wideo trwale zamarza po 5-6 pętlach. – brandon

+0

Występuje również zamrożenie w IOS5 z setRepeatMode: MPMovieRepeatModeOne po wielu pętlach –

Odpowiedz

3

Mogę potwierdzić ustalenia SamBrodkina.

[[NSNotificationCenter defaultCenter] 
    addObserver: self 
    selector: @selector(myMovieFinishedCallback:) 
    name: MPMoviePlayerPlaybackStateDidChangeNotification 
    object: m_player]; 

i

-(void) myMovieFinishedCallback: (NSNotification*) aNotification 
{ 
    NSLog(@"myMovieFinishedCallback: %@", aNotification); 
    MPMoviePlayerController *movieController = aNotification.object; 
    NSLog(@"player.playbackState = %d", movieController.playbackState); 
} 

naprawili problem bez pętli na iOS 5 dla mnie też.

2

Właśnie dostałem tej pracy na moim iPad 3 z systemem iOS 5.1.1, baza SDK iOS 5.1

Po ustawieniu odtwarzacza filmów, ustawić tryb powtarzania do MPMovieRepeatModeNone następnie dodać powiadomienie

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayerDidFinish:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:self.moviePlayer]; 

Następnie skonfigurować przełącznik filtrować po zakończeniu odtwarzania filmu

- (void)moviePlayerDidFinish:(NSNotification *)note { 
    if (note.object == self.moviePlayer) { 
     NSInteger reason = [[note.userInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] integerValue]; 
     if (reason == MPMovieFinishReasonPlaybackEnded) { 
      [self.moviePlayer play]; 
     } 
    } 
} 

Jabłko wykonane jakieś duże zmiany w jaki sposób MPMoviePlaye rController obsługuje ładowanie plików filmowych po zmianie z iOS 4 na iOS 5, więc nie wiem, czy ta metoda zadziała po wydaniu iOS 6

1

Aby zobaczyć przykład, który pokazuje płynne zapętlenie wideo w tle (z animowanego GIF) i przełączanie między parą animacji pierwszoplanowych postaci (z kanałem alfa), spójrz na seamless-video-looping-on-ios. Próbowałem używać AVPlayer w przeszłości i musiałem zrezygnować z rozwiązań związanych z AVPlayer, ponieważ nie działały one wystarczająco dobrze. Zobacz to pytanie SO również iphone-smooth-transition-from-one-video-to-another.

0

Zbadałem ten sam problem, co zgłoszony przez oryginalny plakat (mała pauza w pętli, która zrywała płynność). Na szczęście miałem kolejną próbkę wideo, która nie miała takiego zachowania i znalazłem wyjaśnienie/inne tylko później:

Ścieżka dźwiękowa.

Podejrzewam bardzo powolną inicjalizację dźwięku (routing?).

Usunięcie ścieżki dźwiękowej było dla mnie najłatwiejszym rozwiązaniem (brak dźwięku), ale będę musiał dalej kopać (opcje miksowania audio i testowanie rozwiązania, które zostały opublikowane w tym wątku).

Eric

-1

Aby uniknąć luki, gdy film jest zwinięty, przy użyciu wielu kopii tego samego składnika w kompozycji działa dobrze dla mnie.

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

Złamane łącze, sugerowane rozwiązanie nie działa na prawdziwie płynną pętlę. – MoDJ