Android Exoplayer ConcatenatingMediaSource检测第一个来源的结尾

时间:2018-12-20 10:20:47

标签: android exoplayer exoplayer2.x

我正在尝试将介绍性视频添加到我的实际视频中。我正计划通过使用ConcatenatingMediaSource实现此目的。下面是源代码

DataSource.Factory dataSourceFactory = new CacheDataSourceFactory(VideoCache.getInstance(this), new DefaultDataSourceFactory(this, "test"));
    MediaSource firstSource = new ExtractorMediaSource(Uri.parse("path1.mp4"),
            dataSourceFactory, new DefaultExtractorsFactory(), null, null);
    MediaSource secondSource = new ExtractorMediaSource(Uri.parse("path2.mp4"),
            mediaDataSourceFactory, extractorsFactory, null, null);
// Plays the first video, then the second video.

ConcatenatingMediaSource concatenatedSource =
            new ConcatenatingMediaSource(firstSource, secondSource);
    player.prepare(concatenatedSource);

我需要知道介绍视频何时停止播放,以便我可以进行一些UI更改以及开始显示视频的控制器布局。我尝试过的一种方法是设置一个具有硬编码值的CountDownTimer,一旦调用onFinish,它就会进行必要的更改。我想知道是否有任何侦听器可以帮助我在源结束时获得回调。 onTracksChanged是否适合考虑回调?

1 个答案:

答案 0 :(得分:1)

在您的情况下,当第二个视频开始播放时,将同时调用onTrackChanged()onPositionDiscontinuity()回调。

onPositionDiscontinuity()也将在搜索操作期间被调用。您可以通过在其中调用player.getCurrentWindowIndex()来获取新更改的窗口索引。另一方面,在player.getCurrentWindowIndex()内部调用onTrackChanged()并不能保证获得正确的索引。

更新:

documentation中有一节介绍了如何检测播放过渡。

  

当当前播放项目更改时,可以调用三种类型的事件:

     

EventListener.onPositionDiscontinuity,原因为Player.DISCONTINUITY_REASON_PERIOD_TRANSITION。   当播放自动从一项过渡到另一项时,就会发生这种情况。

     

EventListener.onPositionDiscontinuity,原因为Player.DISCONTINUITY_REASON_SEEK。   当当前播放项作为查找操作的一部分发生更改时(例如,调用Player.next时),就会发生这种情况。

     

EventListener.onTimelineChanged,原因为Player.TIMELINE_CHANGE_REASON_DYNAMIC。   当播放列表更改时(例如,是否添加,移动或删除了项目。

     

在所有情况下,当您的应用程序代码接收到事件时,您都可以查询播放器以确定正在播放播放列表中的哪个项目。可以使用Player.getCurrentWindowIndex和Player.getCurrentTag之类的方法来完成。如果您只想检测播放列表项的更改,则需要与最近一次已知的窗口索引或标记进行比较,因为提到的事件可能是由于其他原因而触发的。