web-dev-qa-db-ja.com

Exoplayerでメディアファイルの終わりを検出するためにoncompletionlistenerを実装する方法

プレイリストの形でビデオを次々に再生しようとしています。 Android Exoplayerを使用してファイルを再生していますが、mediaplayerにメディアファイルの終わりを聞くリスナーがいません。exoplayerを使用してメディアファイルの終わりを聞く方法はありますか? 。

23
user2949215

Exoplayerは、メディアプレーヤーが提供しない高度な実装を提供します。

androidによる Exoplayer の事前の例では、FullPlayerActivity.Javaで実装されていますonStateChanged、これはSTATE_ENDEDを提供します

このページ の右側のセクションから用語の例をダウンロードできますRELATED SAMPLES

私はこれが古いことを知っていますが、受け入れられた答えを拡張するだけです:

exoPlayer.addListener(this);

.....

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

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

GoogleはExoPlayer.STATE_ENDEDを廃止し、Player.STATE_ENDEDに置き換えました。

この投稿は久しぶりなので、下にリスナーのKotlinバージョンを書きます。

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

これを行うことができます:

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);

しかし、@ Murtaza Khursheedフセインの答えは正しいです!素敵なコードデーを!他に何か必要な場合はお知らせください!

8
Cristofer

インターフェースPlayer.EventListerを実装して、exoPlayerに追加する必要があります。

メソッドonPlayerStateChangedでコードを書くだけです。コードを参照してください。

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は廃止されました。代わりにPlayer.STATE_ENDEDを使用してください。例:

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

連結されていないMediaSource(再生する個々のメディアを表す)の場合、メディアの再生が終了するとSTATE_ENDEDを受け取ります。

ConcatenatingMediaSourceの場合、連結全体の再生が終了したときに発生します(つまり、連結の最後の項目の最後まで再生した)。したがって、STATE_ENDEDはMediaSource全体の再生が終了したときに発生します。

ConcatenatingMediaSourceの場合、現在のメディアの終了と次のメディア再生の開始を検出するための最適なコールバックは「onPositionDiscontinuity」です。トランジションが発生したときに把握するには、onPositionDiscontinuity()を使用する必要があります。他のケースでもonPositionDiscontinuityが呼び出されますが、getCurrentWindowIndex()を呼び出して、現在のウィンドウと比較して、遷移が発生したかどうかを判断できます。以下のようなことができます:

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;
  }
}

注: onPositionDiscontinuity()は、player.seekTo(position、0)を明示的に呼び出さない限り、プレイリストの最初のアイテムに対しては呼び出されません。したがって、プレイリスト内のすべてのメディア再生に対して行っていることをすべて処理するには、プレイリストの最初の項目に対して個別に処理する必要があります。

1
Akki

私はexoplayerでプレイリストを使用していて、それが完了した後でメディアを停止したいと思いました。

私にとってPlayer.STATE_ENDEDは、プレイリストが内部で終了したときに呼び出されていました

私のユースケースを満たすために、最初にこれをexoplayerに設定しました

 simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE);

したがって、EventListenerを使用する代わりに、AnalyticsListenerを使用してonPositionDiscontinuityをeventTimeパラメータでオーバーライドし、単純なコードを追加して、メディアが再起動しました。

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

これがあなたのユースケースに役立つことを願っています

0
saurabhlahoti

GoogleはExoPlayer.STATE_ENDEDを廃止しました。代わりにPlayer.STATE_ENDEDを使用してください。以下のコードを参照してください。

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() {

    }
});

詳細は ExoPlayer開発者ページ を確認してください。

0
Oyewo Remi