ExoPlayer 2.xの新機能を使用して、次のようなオーディオファイルのリストを再生しています。
List<MediaSource> playlist = new ArrayList<>();
...
ConcatenatingMediaSource concatenatedSource = new ConcatenatingMediaSource(
playlist.toArray(new MediaSource[playlist.size()]));
mExoPlayer.prepare(concatenatedSource);
mExoPlayer.setPlayWhenReady(true);
これは正常に機能していますが、それに応じてUIを更新するには、現在再生中のトラックとこのトラックの進行状況を知る必要があります。 ExoPlayerからリスナーはいますか?
ありがとう!
したがって、私は同様のシナリオにあり、プレイリストの次のビデオがいつ開始されるかを知る必要があります。 _ExoPlayer.EventListener
_にはonPositionDiscontinuity()
というメソッドがあり、ビデオが変更されるたびに、またはプレイリストの次へ「シーク」されるときに呼び出されます。
私はこの方法を広範囲にわたっていじったことはありませんが、これまで見てきたことから、これはあなたが心配するべき方法です。メソッドの起動時に渡されるパラメーターはないため、特定の瞬間に再生されているものを追跡するために、何らかの種類のカウンターまたはキューを保持する必要があります。
これがお役に立てば幸いです!
編集:Exoplayer.getCurrentWindowIndex()
によって返されるインデックスの変更は 推奨される方法 プレイリスト内のアイテムの変更を検出するMediaSource
。
_int lastWindowIndex = 0; // global var in your class encapsulating exoplayer obj (Activity, etc.)
exoPlayer.addListener(new ExoPlayer.EventListener() {
@Override
public void onLoadingChanged(boolean isLoading) {
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
}
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
}
@Override
public void onPositionDiscontinuity() {
//THIS METHOD GETS CALLED FOR EVERY NEW SOURCE THAT IS PLAYED
int latestWindowIndex = exoPlayer.getCurrentWindowIndex();
if (latestWindowIndex != lastWindowIndex) {
// item selected in playlist has changed, handle here
lastWindowIndex = latestWindowIndex;
// ...
}
}
});
_
次のイベントを実装し、プレーヤーの状態に応じてUIを更新できます。
mExoPlayer.addListener(new ExoPlayer.Listener() {
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == PlaybackStateCompat.STATE_PLAYING) {
//do something
}
}
@Override
public void onPlayWhenReadyCommitted() {
}
@Override
public void onPlayerError(ExoPlaybackException error) {
mExoPlayer.stop();
}
});