问题描述
我正在使用 Leanback 库开发 Android TV 应用程序。我能够使用 Exoplayer 集成 VideoPlaybackActivty。我的一个要求是当当前视频还剩大约 1 分钟时,我需要对服务器进行 Rest 调用以获取下一个要播放的视频,然后我想在右下角显示下一个视频缩略图屏幕。非常类似于 Netflix 的“下一集正在播放……”的功能。
我的问题是,我怎样才能知道视频是否只剩 1 分钟了。另外,如何在屏幕上显示“播放下一个叠加层”?目前我的 activity_videoplayback.xml 如下所示。
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextureView
android:id="@+id/texture_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
<fragment
android:id="@+id/playback_controls_fragment"
android:name="com.myapp.ui.playback.VideoPlaybackFragment"
android:tag="@string/playback_tag"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/stream_progressbar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminateTint="@color/orange"
android:visibility="gone" />
</merge>
非常感谢您的帮助。
解决方法
ExoPlayer 目前不提供进度更新侦听器 - 引用的原因是它会消耗太多 CPU 来继续引发进度事件。请在此处查看有关 ExoPlayer 问题跟踪器的讨论,并注意该问题目前被视为已关闭(2021 年 2 月):
https://github.com/google/ExoPlayer/issues/3980
建议的方法是构建一个处理程序来轮询玩家并使用 player.getCurrentPosition() 查询当前位置。
为了完整起见,如果您也在查看 HTML5 视频,例如在 WebView 中,您可以检查视频长度,然后使用进度事件检查从结束开始的 1 秒 - 这是“标准”HTML5 和javascript 所以应该适用于任何使用 HTML5 视频元素的框架。
代码可能如下所示:
const yourVideo = document.querySelector('yourVideoID');
//Create the event handler
function handleProgressEvent(event) {
//Check if video has reached last 10 seconds
if (yourVideo.currentTime > (yourVideo.duration - 10.0)) {
// DO your work to prepare the next video here
}
}
// Add the event listener to your video
yourVideo.addEventListener('progress',handleProgressEvent);