快速搜索ExoPlayer

时间:2017-05-24 03:52:26

标签: android exoplayer

我想为ExoPlayer实现一个擦除器,以显示用户正在寻找的位置的缩略图预览。当我的当前实现正在运行时,缩略图仅在用户停止拖动搜索栏视图或暂停后立即刷新。似乎ExoPlayer上的搜索命令正在实现类似去抖功能的东西,以防止连续过多的搜索。

虽然我可以通过对搜索栏回调进行自己的限制并每x毫秒发送一次搜索请求来解决这个问题,但我想知道是否有办法告诉ExoPlayer不丢弃搜索请求以便缩略图可以更新实时。

供参考,这是我目前的实施:

受限制的主题:

private final Subject<Long> subject = PublishSubject.create();

具有限制的搜索请求的观察者:

subject
        .throttleLast(400L, TimeUnit.MILLISECONDS)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(position -> exoPlayer.seekTo(position));

Seekbar回调:

@Override
public void onProgressChanged(@NonNull final SeekBar seekBar,
                              final int progress,
                              final boolean fromUser) {
    if (fromUser) {
        final long position = computePosition(progress);
        subject.onNext(position);
    }
}

2 个答案:

答案 0 :(得分:2)

我不知道这是否是最佳解决方案,但您可以查看这个开源项目,它可以实现您正在寻找的大致内容。 Here is the Github

看起来他们使用custom LoadControl来让ExoPlayer更快地渲染帧。我相信他们会选择最差的质量,因此加载速度更快。

这是他们在该库onProgressChange(...)中使用的代码:

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    if(fromUser){
        int offset = (float) progress / seekBar.getMax()
        // Round the offset before seeking. The sample uses 1% or 10% of the video per each thumbnail
        previewPlayer.seekTo((long) (offset * previewPlayer.getDuration()));
        previewPlayer.setPlayWhenReady(false);
    }
}

另一种方法是实际抓取TextureView的缩略图 - 它们在this issue中覆盖。需要注意的是使用多个渲染器有一些限制。

答案 1 :(得分:0)

这很旧,但可能对某人有用:

2.7.0 起,ExoPlayer具有方法Player.setSeekParameters() 如果要将搜寻位置捕捉到最接近的关键帧,请使用SeekParameters.CLOSEST_SYNC(更快,但准确性更低)。要查看确切的帧(即使不是关键帧,也可以查看请求的位置之前的帧),请使用SeekParameters.EXACT