Android ExoPlayer onProgressChanged

Comment puis-je surveiller les changements de progression sur ExoPlayer ?
J'ai essayé de mettre en place un MediaController caché et des méthodes de setOnSeekBarChangeListener , mais pour l'instant sans succès. Je me demande s'il y a un autre moyen d'écouter les progrès de ExoPlayer .

  • Fade in Activity de l'activité précédente dans Android
  • Dessiner des «trous» dans un canevas
  • Conversion Android vers le format ordinal
  • Disposition - Comment ajouter de manière dynamique des vues et une ligne de rupture en fonction de l'espace vide
  • La fonction de rebut RxJava2 ne fonctionne pas correctement dans RecyclerView - Android
  • Utilisation d'icônes dans les préférences d'Android
  • 6 Solutions collect form web for “Android ExoPlayer onProgressChanged”

    Je ne suis pas sûr que ce soit la meilleure façon, mais j'ai réussi en surchargant le TrackRenderer .

    J'utilise videoPlayer.getBufferedPercentage() , mais vous pouvez également calculer le pourcentage vous-même, en utilisant TrackRenderer le getBufferedPositionUs() et getDurationUs()

     public interface ProgressListener { public void onProgressChange(long progress); } public class CustomVideoRenderer extends MediaCodecVideoTrackRenderer { long progress = 0; private final CopyOnWriteArraySet<ProgressListener> progressListeners = new CopyOnWriteArraySet(); // [...] // Skipped constructors // [...] public void doSomeWork(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { super.doSomeWork(positionUs, elapsedRealtimeUs); long tmpProgress = videoPlayer.getBufferedPercentage(); if (tmpProgress != this.progress) { this.progress = tmpProgress; for (ProgressListener progressListener : this.progressListeners) { progressListener.onProgressChange(progress); } } } public void addProgressListener(ProgressListener listener) { this.progressListeners.add(listener); } } 

    Je sais que cette question est très ancienne. Mais, j'ai débarqué à ce sujet lors de la mise en œuvre d' ExoPlayer . C'est pour aider les autres qui font de même plus tard 🙂

    Donc, j'ai suivi les méthodes suivantes pour suivre la progression de la lecture. C'est la façon dont il est fait dans les ExoPlayer Google ExoPlayer . Cela fonctionne selon les besoins.

    Checkout PlaybackControlView.java dans Google ExoPlayer Docs

    updateProgressBar() est la fonction pour mettre à jour les progrès de SeekBar :

     private void updateProgressBar() { long duration = player == null ? 0 : player.getDuration(); long position = player == null ? 0 : player.getCurrentPosition(); if (!dragging) { mSeekBar.setProgress(progressBarValue(position)); } long bufferedPosition = player == null ? 0 : player.getBufferedPosition(); mSeekBar.setSecondaryProgress(progressBarValue(bufferedPosition)); // Remove scheduled updates. handler.removeCallbacks(updateProgressAction); // Schedule an update if necessary. int playbackState = player == null ? ExoPlayer.STATE_IDLE : player.getPlaybackState(); if (playbackState != ExoPlayer.STATE_IDLE && playbackState != ExoPlayer.STATE_ENDED) { long delayMs; if (player.getPlayWhenReady() && playbackState == ExoPlayer.STATE_READY) { delayMs = 1000 - (position % 1000); if (delayMs < 200) { delayMs += 1000; } } else { delayMs = 1000; } handler.postDelayed(updateProgressAction, delayMs); } } private final Runnable updateProgressAction = new Runnable() { @Override public void run() { updateProgressBar(); } }; 

    Nous appelons updateProgressBar() dans updateProgressAction plusieurs reprises jusqu'à ce que la lecture s'arrête. La fonction est appelée la première fois chaque fois qu'il y a un changement d'état. Nous utilisons removeCallbacks(Runnable runnable) pour qu'il y ait toujours une updateProgressAction à updateProgressAction à updateProgressAction .

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

    J'espère que cela t'aides!

    Cela fonctionne au moins avec Exoplayer 2.

    Il y a quatre états de lecture: STATE_IDLE, STATE_BUFFERING, STATE_READY et STATE_ENDED.

    Vérifier l'état de lecture est facile à faire. Il existe au moins deux solutions: if-statement ou switch-statement.

    Quel que soit l'état de la lecture, vous pouvez exécuter votre méthode ou définir autre chose par exemple, la barre de progression.

     @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { if (playbackState == ExoPlayer.STATE_ENDED) { showControls(); Toast.makeText(getApplicationContext(), "Playback ended", Toast.LENGTH_LONG).show(); } else if (playbackState == ExoPlayer.STATE_BUFFERING) { progressBar.setVisibility(View.VISIBLE); Toast.makeText(getApplicationContext(), "Buffering..", Toast.LENGTH_SHORT).show(); } else if (playbackState == ExoPlayer.STATE_READY) { progressBar.setVisibility(View.INVISIBLE); } } 

    Pour préciser, il n'y a pas de build dans EventListener pour l'événement de progression, mais vous pouvez appeler Handler.postDelayed à l'intérieur de la fonction updateProgress () pour obtenir la progression en cours

      private void updateProgress(){ //get current progress long position = player == null ? 0 : player.getCurrentPosition(); //updateProgress() will be called repeatedly, you can check //player state to end it handler.postDelayed(updateProgressAction,1000) } private final Runnable updateProgressAction = new Runnable() { @Override public void run() { updateProgress(); } }; 

    Pour plus de détails, voir la source de PlaybackControlView.java dans Exoplayer

    Élargissez votre classe de joueur actuelle (SimpleExoPlayer for ex.) Et ajoutez

     public interface PlayerEventsListener { void onSeek(int from, int to); void onProgressUpdate(long progress); } private PlayerEventsListener mListener; private Handler mHandler; private Runnable mProgressUpdater; private boolean isUpdatingProgress = false; public SomePlayersConstructor(Activity activity, /*...*/) { //... mListener = (PlayerEventsListener) activity; mHandler = new Handler(); mProgressUpdater = new ProgressUpdater(); } // Here u gain access to seek events @Override public void seekTo(long positionMs) { mListener.onSeek(-1, (int)positionMs/1000); super.seekTo(positionMs); } @Override public void seekTo(int windowIndex, long positionMs) { mListener.onSeek((int)getCurrentPosition()/1000, (int)positionMs/1000); super.seekTo(windowIndex, positionMs); } // Here u gain access to progress public void startProgressUpdater() { if (!isUpdatingProgress) { mProgressUpdater.run(); isUpdatingProgress = true; } } private class ProgressUpdater implements Runnable { private static final int TIME_UPDATE_MS = 500; @Override public void run() { mListener.onProgressUpdate(getCurrentPosition()); mHandler.postDelayed(mProgressUpdater, TIME_UPDATE_MS); } } 

    Ensuite, à l'intérieur de l'activité du joueur, player.startProgressUpdater(); simplement l'interface et démarrez les mises à jour avec player.startProgressUpdater();

    Essayez cela, cela fonctionne pour moi:

     handler = new Handler(); runnable = new Runnable() { @Override public void run() { progressbar.setProgress((int) ((exoPlayer.getCurrentPosition()*100)/exoPlayer.getDuration())); handler.postDelayed(runnable, 1000); } }; handler.postDelayed(runnable, 0); 

    Ici,

    • getCurrentPosition() : retour La position de lecture actuelle en millisecondes.
    • getDuration() : durée de la piste en milliseconde.
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.