31 votes

Irrégularité de VideoView getCurrentPosition() sur Acer Iconia A200

J'ai une application avec une VideoView, je règle la lecture d'une vidéo dans la VideoView. À un moment donné, pendant la lecture de la vidéo, celle-ci est mise en pause. Puis, après une pause d'un certain temps, la vidéo recommence à être lue, mais en avançant jusqu'au point où la vidéo se trouverait si elle n'avait pas été mise en pause. Ainsi, par exemple

La vidéo commence à être diffusée

Vidéo en pause à 6 secondes

la vidéo reste en pause pendant 10 secondes

La vidéo recommence à jouer <--- à ce stade, je veux que la vidéo commence à jouer à la marque de 16 secondes.

Pour obtenir cet effet, j'ai mis en place des horodateurs pour faire les calculs nécessaires afin de savoir combien de temps la vidéo a été mise en pause, puis lorsque je la relance, j'appelle mVideoView.seekTo(timePlayed + timePaused);

Tout cela fonctionne comme prévu sur Toshiba Thrive, et Motorola Xoom. Cependant, sur l'Acer Iconia A200, il semble qu'à partir du moment où j'appelle seekTo() en avant, le VideoView reviendra toujours au même moment lorsque j'appelle getCurrentPosition() . Pour illustrer cela, j'ai mis en place un runnable qui se déclenche environ toutes les 1000 ms et qui enregistre la position actuelle. Voici une partie de la sortie de ce programme :

/****************
* These are from before it is paused/resumed
* you can see that the current time is functioning
* as expected.
******************/
Current Position = 0
Current Position = 734
Current Position = 1735
Current Position = 2703
Current Position = 3737
Current Position = 4738
Current Position = 5739
Current Position = 6740
Current Position = 7741
Current Position = 8742
Current Position = 9743

/**********************************
* These are from the exact same runnable
* after the video has been paused, and
* started again after seekTo().
* The position is no longer increasing.
* Note that the video is playing correctly on the screen
* while these logs happen.
**********************************/
Current Position = 23410
Current Position = 23410
Current Position = 23410
Current Position = 23410

23410 est le temps exact que je passe à seekTo(), donc il semble qu'après avoir fait cet appel, le VideoView retournera toujours ce que je lui passe, peu importe s'il est toujours en train de jouer et si la position avance.

Quelqu'un d'autre a-t-il déjà rencontré ce bogue VideoView/MediaPlayer ? J'ai vu des choses sur le groupe des problèmes connus qui parlaient du fait que le MediaPlayer renvoyait des valeurs incorrectes pour getCurrentPosition(), mais je n'en ai trouvé aucune où il cessait simplement d'augmenter comme ça. La plupart de ceux que j'ai vus essayaient également de lire de l'audio plutôt que de la vidéo.

1voto

user850688 Points 71

Cela peut être lié à la quantité de mémoire libre de l'appareil. Si la mémoire vive est faible, l'activité de fond peut redémarrer en même temps que votre compteur.

1voto

Sharad Mhaske Points 795

Relâchez et réinitialisez le lecteur vidéo dans la méthode onpause de l'activité et réinitialisez-le dans la méthode onstart d'une activité. pour le seekto, vous devez utiliser un chronomètre pour contenir le temps de la vidéo de l'utilisateur. réglez le temps dans le seekto au temps du chronomètre.

1voto

user2297366 Points 172

Peut-être s'agit-il d'un problème de surcharge du thread principal de l'interface utilisateur. Puisque la vidéo est un élément de données élevé et que l'acer iconia n'est pas un grand appareil, cela pourrait causer un manque de données, des anomalies et peut-être même un plantage. Essayez d'ajouter la vidéo en utilisant AsyncTask.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X