2011-12-02 1 views
0

J'utilise MediaPlayer sur Honeycomb et ne peux pas obtenir la durée d'une vidéo HLS (http live streaming) dans la fonction onPrepared().Android MediaPlayer: getDuration() renvoie 0 après prepare()

Si getDuration() est appelée après prepare(), elle retourne 0:

public void onPrepared(MediaPlayer mp) { 
    // getduration returns 0 
    mediaPlayer.start(); 
    Log.d(TAG, "duration: " + mediaPlayer.getDuration()); 
} 

Cependant, les vidéos commence à jouer.

Si getDuration() est appelé à onVideoSizeChanged() il renvoie la valeur correcte,

public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { 
    // returns the correct value 
    Log.d(TAG, "duration: " + mediaPlayer.getDuration()); 
} 

Pourquoi getDuration() travail onVideoSizeChanged() mais pas dans onPrepared()?

Édition: Au début, je pensais que getDuration() ne fonctionnait pas du tout, mais je l'ai trouvé pour retourner la valeur correcte dans onVideoSizeChanged(). Question modifiée pour refléter cela.

Répondre

1

Vous ne pouvez rien y faire. Les détails du flux ne seront pas connus avant la lecture du flux. Selon le format, il peut y avoir des informations correctes près du front du flux, un indice ou rien. Comme l'écouteur de changement de taille de la vidéo est toujours appelé, vous devrez restructurer votre code pour obtenir la durée (si elle est disponible).

(Même si cela est un bug et même si elle est fixée, une telle solution ne serait pas déployé à des millions d'appareils existants de sorte que vous êtes coincé avec le comportement actuel.)

+0

Merci pour l'explication utile! – jules

+0

Que se passe-t-il si mp.getDuration() appelé dans un thread, ce thread appelé chaque 100ms? Je pense qu'à un moment donné cette fonction ne revient pas à zéro mais elle n'est pas correcte. Pourquoi ? – phongvan

Questions connexes