项目记录: 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);
}
}
});