web-dev-qa-db-fra.com

Comment implémenter oncompletionlistener pour détecter la fin du fichier multimédia dans Exoplayer

J'essaye de lire des vidéos sous forme de playlist l'une après l'autre. J'utilise Android Exoplayer pour lire mes fichiers, mais il n'y a pas d'écouteurs dans mediaplayer pour écouter une fin du fichier multimédia. Existe-t-il un moyen d'écouter la fin du fichier multimédia à l'aide d'exoplayer .

23
user2949215

Exoplayer offre une implémentation avancée, contrairement au lecteur multimédia.

dans l'exemple avancé de Exoplayer par Android, dans FullPlayerActivity.Java qu'ils ont implémenté onStateChanged , qui offre STATE_ENDED

Vous pouvez télécharger un exemple dans la section de droite de cette page sous terme EXEMPLES CONNEXES

Je sais que c'est vieux, mais juste pour développer la réponse acceptée:

exoPlayer.addListener(this);

.....

@Override
public void onPlayerStateChanged(boolean playWhenReady, int state) {

    if (state == ExoPlayer.STATE_ENDED){
        //player back ended
    }
}
36
Joe Maher

Google a déprécié ExoPlayer.STATE_ENDED et a remplacé par Player.STATE_ENDED.

Étant donné que ce message a été un certain temps, je vais écrire une version Kotlin de l'auditeur ci-dessous.

this.simpleExoPlayer?.addListener(object : Player.DefaultEventListener() {
            override fun onPlayerStateChanged(playWhenReady: Boolean,playbackState: Int) {
                when (playbackState) {
                    Player.STATE_IDLE -> {}
                    Player.STATE_BUFFERING -> {}
                    Player.STATE_READY -> {}
                    Player.STATE_ENDED -> {}
                }
            }
        })
12
Morgan Koh

Vous pouvez le faire:

playerExo.addListener(new ExoPlayer.Listener() {

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

                switch(playbackState) {
                    case ExoPlayer.STATE_BUFFERING:
                        break;
                    case ExoPlayer.STATE_ENDED:
                        //do what you want
                        break;
                    case ExoPlayer.STATE_IDLE:
                        break;
                    case ExoPlayer.STATE_PREPARING:
                        break;
                    case ExoPlayer.STATE_READY:
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onPlayWhenReadyCommitted() {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {

            }
        });
        playerExo.seekTo(0);
        playerExo.setPlayWhenReady(true);

Mais la réponse de @Murtaza Khursheed Hussain est juste! Passez une bonne journée de code! Faites-moi savoir si vous avez besoin d'autre chose!

8
Cristofer

Vous devez implémenter l'interface Player.EventLister et l'ajouter à votre exoPlayer.

Écrivez simplement votre code sur la méthode onPlayerStateChanged. Voir le code.

exoPlayer.addListener( new Player.EventListener() {
            @Override
            public void onTimelineChanged(Timeline timeline, @Nullable Object manifest, int reason) {

            }

            @Override
            public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

            }

            @Override
            public void onLoadingChanged(boolean isLoading) {

            }

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

                switch(playbackState) {
                    case Player.STATE_BUFFERING:
                        break;
                    case Player.STATE_ENDED:
                        //Here you do what you want
                        break;
                    case Player.STATE_IDLE:
                        break;
                    case Player.STATE_READY:
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onRepeatModeChanged(int repeatMode) {

            }

            @Override
            public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {

            }

            @Override
            public void onPositionDiscontinuity(int reason) {

            }

            @Override
            public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

            }

            @Override
            public void onSeekProcessed() {

            }


        });
7
Leo Paim

ExoPlayer.STATE_ENDED est amorti. Utilisez plutôt Player.STATE_ENDED. Exemple:

@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
    if(playbackState == Player.STATE_ENDED){
        // your brain put here
    }
}
2
Tomero Indonesia

Pour MediaSource non concaténé (représentant le média individuel que vous souhaitez lire), vous recevrez STATE_ENDED lorsque le média aura fini de jouer.

Pour un ConcatenatingMediaSource, cela se produit lorsque la concaténation entière a fini de jouer (c'est-à-dire que vous avez joué jusqu'à la fin du dernier élément de la concaténation). Donc, STATE_ENDED se produit lorsque la totalité de la MediaSource a fini de jouer.

Pour un ConcatenatingMediaSource, le meilleur rappel pour détecter la fin du média actuel et le début de la lecture du média suivant est "onPositionDiscontinuity". Vous devez utiliser onPositionDiscontinuity () pour déterminer quand les transitions se produisent. Veuillez noter que onPositionDiscontinuity est également appelé pour certains autres cas, mais vous pouvez appeler getCurrentWindowIndex () et le comparer à la fenêtre dans laquelle vous pensez être pour déterminer si une transition s'est produite. Vous pouvez faire quelque chose comme ci-dessous:

public void onPositionDiscontinuity() {
  int newIndex = player.getCurrentWindowIndex();
  if (newIndex != currentIndex) {
    // The index has changed ==> last media has ended and next media playback is started.
    currentIndex = newIndex;
  }
}

Veuillez noter: onPositionDiscontinuity () n'est pas appelé pour le 1er élément de la liste de lecture, sauf si nous appelons explicitement player.seekTo (position, 0). Donc, pour gérer tout ce que vous faites pour la lecture de tous les médias dans la liste de lecture, vous devez gérer séparément le premier élément de la liste de lecture.

1
Akki

J'utilisais une playlist avec exoplayer et je voulais arrêter le média une fois terminé.

Pour moi, le Player.STATE_ENDED était appelé lorsque la playlist s'est terminée pour moi à l'intérieur

Donc, pour répondre à mon cas d'utilisation, je l'ai d'abord défini dans exoplayer

 simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE);

Donc, au lieu d'utiliser EventListener, j'avais utilisé AnalyticsListener qui donne onPositionDiscontinuity pour remplacer le paramètre eventTime et simplement ajouter un code simple pour savoir si le média a redémarré.

   @Override
   public void onPositionDiscontinuity(EventTime eventTime, int reason) {
        if (eventTime.currentPlaybackPositionMs / 1000 < 1) {
            exoPlayer.setPlayWhenReady(false);
            tvReplay.setVisibility(View.VISIBLE);
        }
    }

J'espère que cela aide votre cas d'utilisation

0
saurabhlahoti

Google a déprécié ExoPlayer.STATE_ENDED. Utilisez plutôt Player.STATE_ENDED. Voir le code ci-dessous.

player.addListener(new Player.EventListener() {
    @Override
    public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {


    }

    @Override
    public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

    }

    @Override
    public void onLoadingChanged(boolean isLoading) {

    }

    @Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

        if (playWhenReady && playbackState == Player.STATE_READY) {
            // Active playback.
        } else if (playbackState == Player.STATE_ENDED) {
            //The player finished playing all media

           //Add your code here

        } else if (playWhenReady) {
            // Not playing because playback ended, the player is buffering, stopped or
            // failed. Check playbackState and player.getPlaybackError for details.
        } else {
            // Paused by app.
        }

    }

    @Override
    public void onRepeatModeChanged(int repeatMode) {

    }

    @Override
    public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

    }

    @Override
    public void onPlayerError(ExoPlaybackException error) {

    }

    @Override
    public void onPositionDiscontinuity(int reason) {
        //THIS METHOD GETS CALLED FOR EVERY NEW SOURCE THAT IS PLAYED
      //  int latestWindowIndex = player.getCurrentWindowIndex();


    }

    @Override
    public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

    }

    @Override
    public void onSeekProcessed() {

    }
});

Vous pouvez vérifier page développeur ExoPlayer pour plus d'informations.

0
Oyewo Remi