Android ExoPlayer: résout-il le problème de lecture gapless / seamless qui est cassé pour le Lecteur Multimédia Android
Quelqu'un a-t-il essayé D'utiliser ExoPlayer pour y parvenir? J'ai essayé de regarder en ligne, sans succès.
Quand je dis la lecture gapless, je fais référence au problème de l'utilisation du lecteur multimédia pour lire des vidéos locales dos à dos. Après la lecture de la première vidéo, il y a un retard notable de 1 seconde avant le début de la deuxième vidéo.
En espérant que cette question aide à comprendre ce problème plus loin. Pour référence, veuillez consulter la question suivante:
Android: MediaPlayer lecture vidéo sans gapless ou transparente
4 réponses
ExoPlayer 2 , qui est maintenant officiellement publié, semble prendre en charge la lecture gapless en utilisant la classe ConcatenatingMediaSource
. À partir de son guide du développeur:
Les Transitions entre les sources sont transparentes. Il n'est pas nécessaire que les sources concaténées soient du même format (par exemple, il est bon de concaténer un fichier vidéo contenant 480p H264 avec un fichier contenant 720p VP9). Les sources peuvent même être de différents types (par exemple, il est bon de concaténer une vidéo avec un audio seulement de flux).
Et l'exemple de code:
MediaSource firstSource = new ExtractorMediaSource(firstVideoUri, ...);
MediaSource secondSource = new ExtractorMediaSource(secondVideoUri, ...);
// Plays the first video, then the second video.
ConcatenatingMediaSource concatenatedSource =
new ConcatenatingMediaSource(firstSource, secondSource);
Modifier: ExoPlayer 2 prend en charge la lecture gapless, mais au moment de l'écriture est toujours inédite en tant que version stable.
Vous ne serez probablement jamais en mesure d'obtenir une lecture parfaite de plusieurs pistes avec ExoPlayer ou Android Media Player. Ni l'un ni l'autre n'ont été écrits pour prendre en charge le démarrage de plusieurs pistes et j'imagine que cela restera hors de portée pour les deux.
Vous pouvez obtenir une lecture gapless en utilisant 2 instances de lecteur différentes, une fois que vous ont commencé et joué le premier, vous pouvez charger le second et commencer la lecture une fois que la première se termine. En utilisant cette méthode, vous pourriez avoir une solution gapless, tant que vous préparez la deuxième vidéo pendant la lecture de la première.
Pour aller plus loin, vous pouvez également utiliser 2 textures de surface différentes pour rendre les multiples vidéos, Une fois que la première vidéo atteint la fin, vous pouvez effacer la texture et fondu dans la nouvelle. Résultant en un bel effet vidéo transparente.
À cause de la nature de la lecture de plusieurs vidéos à la fois, vous voudrez probablement créer votre propre minuterie pour incrémenter le temps et décider quand passer à la vidéo suivante, plutôt que d'essayer d'utiliser les rappels de médias ExoPlayer ou Android. Cela vous permettra de garder une trace de l'heure d'une manière plus précise, sans avoir besoin de continuer à parler à plusieurs codecs vidéo.
Je sais que ce n'est pas la réponse que vous cherchiez, mais c'est la seule réponse raisonnable. La seule façon d'assurer aucune lacune dans la lecture est de télécharger le fichier entier en premier et commencer la lecture quand il est fait. Sinon, dans le cas où vous perdez la connectivité avant que le fichier ne soit terminé le téléchargement, la pause est inévitable.
J'ai juste essayé de passer à ExoPlayer à partir de L'implémentation standard de MediaPlayer et l'écart est le même sinon pire. Cependant, j'ai utilisé une méthode très simple de redémarrer le joueur lorsque le statut change à terminé. Je ne sais pas s'il y a une meilleure façon de le faire, peut-être avec 2 ExoPlayers différents.