2015-03-05 1 views
1

J'essaie de faire des retards entre AVPlayerItems, mais je ne comprends pas comment faire cela. J'ai besoin de jouer des sons en arrière-plan (lorsque l'application iOS en arrière-plan) avec des retards entre ces sons. Mais AVQueuePlayer ne prend pas en charge cette fonctionnalité. Lorsque j'essaie de mettre le son en pause après la fin, le son suivant ne veut pas jouer. Cependant, au premier plan, cet algorithme fonctionne bien.Comment faire des retards entre AVPlayerItems dans AVQueuePlayer en tâche de fond?

C'est code, qui en cours d'exécution en tâche de fond:

AVQueuePlayer *player = [[AVQueuePlayer alloc] initWithItems: items]; 
[player play]; 

NSUInteger currentIndex = 0; 
AVPlayerItem *lastItem = nil; 
while(currentIndex < items.count && self.enabled) { 
    AVPlayerItem *currentItem = [player currentItem]; 

    while(currentItem == lastItem || currentItem == nil) { 
     [NSThread sleepForTimeInterval:0.2f]; 
     currentItem = [player currentItem]; 
    } 

    while(currentItem.status != AVPlayerItemStatusReadyToPlay) { 
     [NSThread sleepForTimeInterval:0.2f]; 
     NSLog(@"Loading..."); 
    } 

    lastItem = currentItem; 

    CGFloat time = 0.0f; 
    CGFloat duration = 0.0f; 

    while(duration < 0.5f) { 
     [NSThread sleepForTimeInterval: 0.5f]; 
     if(currentItem.duration.timescale > 0) 
      duration = (double) currentItem.duration.value/(double) currentItem.duration.timescale; 
    } 

    while(time < duration - 0.1f) { 
     [NSThread sleepForTimeInterval: 0.08f]; 
     time = (double) currentItem.currentTime.value/(double) currentItem.currentTime.timescale; 
    } 

    [player pause]; 

    CGFloat delay = someDelayBetweenSounds; 
    [NSThread sleepForTimeInterval: delay]; 

    [player play]; 

    currentIndex++; 
} 

Mon anglais est très mauvais, donc je me excuse

Répondre

1

Lorsqu'un élément se termine, vous pouvez mettre en pause le lecteur et redémarrez-le après un délai donné. C'est beaucoup mieux de le faire de cette façon que de bloquer un fil entier.

- (void) AVPlayerItemDidPlayToEndTimeNotification: (NSNotification *)notification { 
    self.avQueuePlayer.rate = 0; 
    CGFloat delay = 500; 
    dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (delay) * NSEC_PER_MSEC); 
    dispatch_after(delay, dispatch_get_main_queue() , ^{ 
     self.avQueuePlayer.rate = 1; 
}); 
+0

Ne fonctionne pas. Quand je règle le taux à 0, il cesse de jouer. D'accord. Mais si j'essaye de mettre le taux du joueur à 1 après cela, il ne joue plus jamais. – chudin26

+0

Utilisez-vous un AVQueuePlayer? Vous devez d'abord vous assurer que vous avez un autre fichier en file d'attente. – Oren

+0

J'ai plusieurs éléments dans AVQueuePlayer. Est-ce que tu voulais dire ça? – chudin26