我正在尝试添加一个介绍视频到我的实际视频。我计划通过使用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是一个需要考虑的适当回调吗?
发布于 2019-08-05 11:07:20
在您的示例中,当第二个视频开始播放时,将同时调用onTrackChanged()和onPositionDiscontinuity()回调。
在查找操作期间还将调用onPositionDiscontinuity()。您可以通过在其中调用player.getCurrentWindowIndex()来获得新更改的窗口索引。另一方面,在player.getCurrentWindowIndex()中调用onTrackChanged()不能保证得到正确的索引。
更新:
文档中有一节解释了如何检测回放转换。
当当前播放项更改时,可以调用三种类型的事件: 有理由的EventListener.onPositionDiscontinuity =EventListener.onPositionDiscontinuity当回放从一个项目自动转换到下一个项目时,就会发生这种情况。 有理由的EventListener.onPositionDiscontinuity = Player.DISCONTINUITY_REASON_SEEK。当当前回放项更改为查找操作的一部分时(例如,调用Player.next时),就会发生这种情况。 有理由的EventListener.onTimelineChanged = Player.TIMELINE_CHANGE_REASON_DYNAMIC。这在播放列表发生更改时发生,例如,如果添加、移动或删除项。 在所有情况下,当应用程序代码接收到事件时,可以查询播放机以确定播放列表中的哪个项正在播放。这可以使用诸如Player.getCurrentWindowIndex和Player.getCurrentTag之类的方法来完成。如果您只想检测播放列表项的更改,那么有必要与最后一个已知的窗口索引或标记进行比较,因为上述事件可能是出于其他原因触发的。
https://stackoverflow.com/questions/53866692
复制相似问题