Android Exoplayer如何通过编程实现“快进”和“快退”功能

5
我在我的Android应用程序中使用了ExoPlayer,并希望以编程方式执行“快进”和“快退”,而这两个按钮不在控制视图布局中。
这两个按钮位于ExoPlayer视图之外,但在屏幕上,当用户单击“快进”或“快退”时,它将按照相应的方式工作。
一些博客提供了解决方案,但都是针对控制视图的,例如:
app:fastforward_increment="30000"
app:rewind_increment="30000"

但在我的情况下,按钮完全超出了播放器视图范围。
之前 此处 已经问过同样的问题,但没有得到适当的解决方案。
附上截图: enter image description here 尝试以下代码,但没有任何影响:
//switch case onClick listener for 'Forward' and 'Rewind'
case R.id.text_view_rewind:
    simpleExoPlayerView.setRewindIncrementMs(5000);
    break;
case R.id.text_view_forward:
     simpleExoPlayerView.setFastForwardIncrementMs(5000);
     break;
5个回答

12

从版本2.16.1开始,您可以这样设置:

val player = ExoPlayer.Builder(this)
            .setSeekBackIncrementMs(10000)
            .setSeekForwardIncrementMs(10000)
            .build()

1
这太棒了!你知道是否有一种方法可以在用户玩游戏时更改这些参数吗?在我的应用程序中,我允许用户在运行时更改此设置。如果没有,我可以编写自定义操作,所以没什么大不了的,但这会很方便。 - AlexW.H.B.

9

对于 Kotlin 的团队:

player.seekTo(player.currentPosition + 5000)

需要注意的重要事情是:您不必担心越过视频范围的问题。例如,如果您倒回10秒钟,但您只在第5秒钟,它不会到达-5秒钟,而是会到达0。在视频末尾按快进同样道理。


它运作良好。但我们没有任何直接的方法来前进/后退当前播放吗?我找到了一个名为seekForward()的方法,但没有找到任何示例。 - Kishan Solanki

1
如果有人想在他们的视频播放器上添加倒带和快进功能或者使用ExoPlayer2,那么这段代码可能会对你有所帮助。只需将此代码添加到您的按钮单击侦听器中即可。
//switch case onClick listener for 'Forward' and 'Rewind'

case R.id.exo_rewind:
    try {
        player.seekTo(player.getCurrentPosition() - 10000); // 10000 = 10 Seconds
    } catch (Exception e) {
        Toast.makeText(this, "Error : " + e.toString(), Toast.LENGTH_SHORT).show();
    }
    break;

    case R.id.exo_forword:
        try {
            player.seekTo(player.getCurrentPosition() + 10000); // 10000 = 10 Seconds
        } catch (Exception e) {
            Toast.makeText(this, "Error : " + e.toString(), Toast.LENGTH_SHORT).show();
        }
        break;

或者

//switch case onClick listener for 'Forward' and 'Rewind'

case R.id.exo_rewind:
    int rewind = (int) player.getCurrentPosition();
    rewind = rewind - 10000; // 10000 = 10 Seconds
    player.seekTo(rewind);
    break;
case R.id.exo_forward:
    int forward = (int) player.getCurrentPosition();
    forward = forward + 10000; // 10000 = 10 Seconds
    player.seekTo(forward);
    break;

1
如果我正确理解了这个问题,您想要一个快进和快退选项,以便在外部播放操作未执行之前以2x、4x或8x的速度继续快进/快退内容。
如果这就是您想要做的事情,那么您需要做3件事:
1.查找当前播放位置 2.基于2x 4x 8x速度计算视频应该跳到的下一个播放位置 3.不断执行步骤1和2,直到调用播放为止。
将这个理论转化为代码的样子如下:
// current playback position 
var startPosition = player.currentPosition

// start time, usually -> System.currentTimeMillis()
var startTime = 0

// Speed representing playback rate 
var speed = 11

inner class FastForwardRunnable : Runnable {

    override fun run() {

        var nextPosition = startPosition.plus((System.currentTimeMillis() - startTime) * speed)

        if (nextPosition > metadata.duration) {
            nextPosition = metadata.duration
        }

        player.seekTo(nextPosition)
    }
}

在这里建议使用Handler进行连续循环,因为它易于处理并可处理UI线程上的所有这些UI操作。希望这可以帮助您,如果与此相关的任何问题,请告诉我。
注意:这是虚拟代码,仅用于说明。请填写所有值并尝试。

0

你需要使用 seekTo(Position)。

 int p = player.getCurrentPosition();
 p = p + 5000; // for rewind use -5000
 player.seekTo(p);

然后更新进度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接