專案記錄: Exoplayer V2 dynamic-playlist使用
阿新 • • 發佈:2018-12-25
專案記錄: Exoplayer V2開發
dynamic-playlist使用與修改
建立 ConcatenatingMediaSource
在 Exoplayer V2
中的 initializePlayer()
:
mediaSource = new ConcatenatingMediaSource(mediaSources);
動態新增 MediaSource
concatenatingMediaSource = (ConcatenatingMediaSource)mediaSource; // 獲得ConcatenatingMediaSource的引用
// 筆記:建立一個MediaSource
String addString = new String("/storage/emulated/0/Download/3D_Rio_shark.MP4");
MediaSource addMediaSource = buildMediaSource(Uri.parse(addString));
concatenatingMediaSource.addMediaSource(addMediaSource);// 新增一個MediaSource到concatenatingMediaSource當中
- 動態新增可以是多個;
- 動態新增可以在任何時間進行;
準備播放器
// 準備播放器
player.prepare(mediaSource, !haveStartPosition, false);
- 當呼叫
player.prepare
後, 則進入播放的過程.
Track the Playlist
- 可以通過給
palyer
新增監聽器
, 重寫onPositionDiscontinuity
函式,那麼playlist
從 一個MediaSource
切換到另一個 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; // ... } } });
- 示例:
- 在切換的時候,建立新的
MediaSource
, 並將其移動到dynamic-playl
的隊首,呼叫player.prepare
進行播放. - 實現了切換,但是會出現一個短暫的黑屏現象.
player.addListener(new Player.EventListener() {
@Override
public void onPositionDiscontinuity(int reason) {
Log.e("jianzhao", "onPositionDiscontinuity::lastWindowIndex: " +lastWindowIndex);
int latestWindowIndex = player.getCurrentWindowIndex();
Log.e("jianzhao", "onPositionDiscontinuity::getCurrentWindowIndex: " +latestWindowIndex );
if (latestWindowIndex != lastWindowIndex) {
// item selected in playlist has changed, handle here
lastWindowIndex = latestWindowIndex;
//ConcatenatingMediaSource concatenatingMediaSource = (ConcatenatingMediaSource)mediaSource;\
String addString=null;
if(latestWindowIndex%2==0){
addString = new String("/storage/emulated/0/Download/3D_Rio.MP4");
}
else{
addString = new String("/storage/emulated/0/Download/3D_Rio_shark.MP4");
}
MediaSource addMediaSource = buildMediaSource(Uri.parse(addString));
mediaSource.addMediaSource(addMediaSource);
int Size = mediaSource.getSize();
Log.e("jianzhao", "onPositionDiscontinuity::ConcatenatingMediaSource_Size: " +Size );
mediaSource.moveMediaSource(Size-1,0);
player.prepare(mediaSource);
}
}
});