2009-05-19 8 views
1

J'essaie d'utiliser le AVAudioPlayer avec un curseur afin de chercher dans une piste (rien de compliqué).AVAudioPlayer currentTime question

Mais j'ai un comportement bizarre ... pour une valeur de currentTime (entre 0 et TrackDuration), le joueur arrêt lecture de la piste, et va dans audioPlayerDidFinishPlaying:successfully: avec succès NO. Et ça n'a pas marché audioPlayerDecodeErrorDidOccur:error:

C'est comme si je ne pouvais pas lire le temps que je lui consacrais.

Par exemple la durée de la piste est: 295.784424 seconde I donnent le currentTime à 55.0s (ie: 54,963878 54,963900 ou ou 54,987755, etc ... lors de l'impression en% f). Les « accidents » se produisent toujours lorsque le currentTime est 54,987755 ... et je ne comprends vraiment pas pourquoi ...

Donc, si vous avez une idée ... ^^

Répondre

1

Je l'ai essayé avec un périphérique, et c'est un problème qui se produit uniquement avec le simulateur. Tous mes fichiers sont bien lus sur l'appareil, et je peux chercher facilement à l'intérieur d'eux.

J'ai essayé les formats mp3, aac et wav.

5

je me battais aussi pour obtenir des sautes de son bon fonctionnement avec « AVAudioPlayer setCurrentTime:`

Après beaucoup d'expérimentation que j'ai trouvé une séquence qui fonctionne de manière fiable sur le simulateur et le dispositif: (testé sur OS3.1 +

// Skips to an audio position (in seconds) of the current file on the [AVAudioPlayer* audioPlayer] class instance 
// This works correctly for a playing and paused audioPlayer 
// 
- (void) skipToSeconds:(float)position 
{ 
    @synchronized(self) 
    { 
     // Negative values skip to start of file 
     if (position<0.0f) 
      position = 0.0f; 

     // Rounds down to remove sub-second precision 
     position = (int)position; 

     // Prevent skipping past end of file 
     if (position>=(int)audioPlayer.duration) 
     { 
      NSLog(@"Audio: IGNORING skip to <%.02f> (past EOF) of <%.02f> seconds", position, audioPlayer.duration); 
      return; 
     } 

     // See if playback is active prior to skipping 
     BOOL skipWhilePlaying = audioPlayer.playing; 

     // Perform skip 
     NSLog(@"Audio: skip to <%.02f> of <%.02f> seconds", position, audioPlayer.duration); 

     // NOTE: This stop,set,prepare,(play) sequence produces reliable results on the simulator and device. 
     [audioPlayer stop]; 
     [audioPlayer setCurrentTime:position]; 
     [audioPlayer prepareToPlay]; 

     // Resume playback if it was active prior to skipping 
     if (skipWhilePlaying) 
      [audioPlayer play]; 
    } 
} 
+0

Il s'est avéré que la pause était en cours, changer .currentTime, puis la lecture ne fonctionnait pas dans tous les cas. Utiliser stop au lieu de suggérer ici m'a aidé. – Jonny

1

Pour une raison quelconque lorsque j'obtiens cette erreur, l'indicateur est toujours défini sur OUI. J'ai réussi à trouver une solution de contournement en vérifiant currentTime vs durée et en redémarrant le lecteur immédiatement si le currentTime n'est pas 0.0 (la fin du son). Tous mes tests sont effectués sur le simulateur car je n'ai pas encore de licence pour tester sur mon téléphone. J'espère que cela t'aides. Voir les modifications pour quelques bizarreries.

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    if ([_player currentTime] != [_player duration] && [_player currentTime] != 0.0f) { 
     [_player play]; 
     return; 
    } 
... 

EDIT: Malheureusement, je n'ai toujours trouvé des erreurs lors de la recherche au début ou fin d'un son (ou dans un très petit incrément de soit). J'ai trouvé que si vous créez des cas spéciaux qui traitent ces deux cas, vous êtes généralement couvert. Vous devriez arrêter le joueur, mettre le currentTime à 0.0 et puis recommencer le joueur si vous cherchez au début ou appeler manuellement le délégué d'arrivée si vous cherchez à la fin (si vous l'avez implémenté).

Si je trouve une meilleure solution ou que j'obtiendrai plus de commentaires sur l'utilisation de ce périphérique, je le mettrai à jour.

Questions connexes