我想为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);
}
}
答案 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
。