【问题标题】:Android Exoplayer 'Forward', 'Rewind' programmaticallyAndroid Exoplayer 'Forward', 'Rewind' 以编程方式
【发布时间】:2021-12-27 19:17:42
【问题描述】:

我的 Android 应用中有 exoplayer,想以编程方式执行“前进”、“后退”,而这两个按钮不在控制视图布局中。

这两个按钮在 exoplayer 视图之外,但在屏幕中,当用户单击“前进”或“后退”时,它会相应地工作。

一些博客给出了解决方案,但都是用于控制视图,例如:

app:fastforward_increment="30000"
app:rewind_increment="30000"

但在我的情况下,按钮完全在播放器视图之外。

之前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;

【问题讨论】:

    标签: android exoplayer


    【解决方案1】:

    对于 Kotlin 团队:

    player.seekTo(player.currentPosition + 5000)
    

    需要注意的重要一点:您不必担心超出视频范围。例如,如果您点击快退 10 秒,但您只在视频的第 5 秒,它不会转到 -5 秒,而是转到 0。与在视频结束时按快进相同。

    【讨论】:

    • 它正在工作。但是我们没有任何直接的方法来向前/向后播放当前播放吗?我找到了一种方法 seekForward() 但没有找到任何示例。
    【解决方案2】:

    2.16.1 版本可以这样设置:

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

    【讨论】:

    • 这太棒了!您知道是否有办法在播放器播放时更改这些参数?在我的应用程序中,我让用户能够在运行时更改此设置。如果不是我,我可以只写一个自定义动作,所以没什么大不了的,但它会很方便。
    【解决方案3】:

    如果我正确理解了这个问题,您需要一个快进和快退选项,以 2 倍或 4 倍或 8 倍的速度继续快进/快退内容,直到不执行外部播放操作。

    如果这是您想要做的,那么您需要做 3 件事:

    1. 查找当前播放位置
    2. 基于 2x 4x 8x 速度计算视频应该跳转的下一个播放位置
    3. 继续执行第 1 步和第 2 步,直到不调用 play。

    将这个理论翻译成代码如下:

    // 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操作。 希望这会有所帮助,如果有任何与此相关的问题,请告诉我。

    注意:这是一个伪代码,此处仅用于说明。填写所有值并尝试。

    【讨论】:

      【解决方案4】:

      你需要使用 seekTo(Position)

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

      然后更新进度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-07
        • 2017-07-09
        • 1970-01-01
        相关资源
        最近更新 更多