Exoplayer Leanback 的 Netflix 风格下一集

问题描述

我正在使用 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);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...