我正在尝试将介绍性视频添加到我的实际视频中。我正计划通过使用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是否适合考虑回调?
答案 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之类的方法来完成。如果您只想检测播放列表项的更改,则需要与最近一次已知的窗口索引或标记进行比较,因为提到的事件可能是由于其他原因而触发的。