プレイリストの形でビデオを次々に再生しようとしています。 Android Exoplayerを使用してファイルを再生していますが、mediaplayerにメディアファイルの終わりを聞くリスナーがいません。exoplayerを使用してメディアファイルの終わりを聞く方法はありますか? 。
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
}
}
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 -> {}
}
}
})
これを行うことができます:
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フセインの答えは正しいです!素敵なコードデーを!他に何か必要な場合はお知らせください!
インターフェース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() {
}
});
ExoPlayer.STATE_ENDEDは廃止されました。代わりにPlayer.STATE_ENDEDを使用してください。例:
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if(playbackState == Player.STATE_ENDED){
// your brain put here
}
}
連結されていない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)を明示的に呼び出さない限り、プレイリストの最初のアイテムに対しては呼び出されません。したがって、プレイリスト内のすべてのメディア再生に対して行っていることをすべて処理するには、プレイリストの最初の項目に対して個別に処理する必要があります。
私は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);
}
}
これがあなたのユースケースに役立つことを願っています
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開発者ページ を確認してください。