Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PC端观看番剧时右方向键和右方向键长按的区别 #502

Open
1 task done
xxfttkx opened this issue Dec 22, 2024 · 12 comments
Open
1 task done

PC端观看番剧时右方向键和右方向键长按的区别 #502

xxfttkx opened this issue Dec 22, 2024 · 12 comments
Labels
question Further information is requested

Comments

@xxfttkx
Copy link
Contributor

xxfttkx commented Dec 22, 2024

issue 内容

右键作用是快进10s,右键长按作用是加速播放,但在按下右键到判断是右键长按间有一段时间空隙,在这时间内松开右键时没能快进10s,这是希望的设计吗。我尝试引入一个bool变量能解决这个问题,但不知这是否是需要的。

另外还有一些问题。

代码中有类似这种片段

if (playerTimer != null) {
  playerTimer!.cancel();
}

为什么不简化成

playerTimer?.cancel();

在各个键按下之后有重新执行playerTimer = getPlayerTimer();。这是做了什么,getPlayerTimer函数中是Timer.periodic,即不断执行其中的函数,不再重新赋值应该也是能持续作用的吧?

目前暂停的时候不会updateHistory,这部分不需要修改吗,即如果我暂停后调整进度条,然后退出,我的进度并不能被保存。

提交前确认

  • issue 列表中,没有我的新功能需求 / 问题
@Predidit
Copy link
Owner

  1. 可以简化,你可以提交相关PR

  2. 因为我们需要在特定场合下取消 PlayerTimer,你可以检索一下这个变量的使用情况

  3. 我觉得没有必要那么做

@Predidit
Copy link
Owner

长按快进相关代码来自 @ErBWs

@xxfttkx
Copy link
Contributor Author

xxfttkx commented Dec 22, 2024

感谢回答。1的问题我稍后提交pr。2的问题我再去看看代码。

@Predidit Predidit added the question Further information is requested label Dec 22, 2024
@xxfttkx
Copy link
Contributor Author

xxfttkx commented Dec 22, 2024

我仍不能理解playerTimer不断cancel再赋值的做法。

我的理解是,它是在动画播放过程中每一秒需执行一次的全局函数,只需在init时初始化,dispose时销毁即可。

我将键盘控制时的相关的cancel再赋值删去之后程序也能正常运行;关于“播放器手势控制”相关的GestureDetector中的playerTimer?.cancel();onHorizontalDragEnd中的playerTimer = getPlayerTimer();我不知是什么作用也不知道如何调试,我觉得可以在getPlayerTimer开始时设置个bool变量判断是否需要向下执行,以保持在playerTimer在全局起作用,且不需不断销毁再赋值。

@Predidit
Copy link
Owner

举一个例子,手势快进的场合

手势调整当前进度,会影响当前屏幕上的进度条,当手势结束时才会调用 seek 进行真正的跳转

这里如果定时器不取消的话,会继续同步播放器的实际进度,导致进度条的闪烁

@xxfttkx
Copy link
Contributor Author

xxfttkx commented Dec 22, 2024

举一个例子,手势快进的场合

手势调整当前进度,会影响当前屏幕上的进度条,当手势结束时才会调用 seek 进行真正的跳转

这里如果定时器不取消的话,会继续同步播放器的实际进度,导致进度条的闪烁

这种情况我认为可以在getPlayerTimer()中设置一个bool timerPause,当timerPause==false时才执行计时器中操作。手势快进时设timerPause=true,当seek结束后timerPause=false

@ErBWs
Copy link
Contributor

ErBWs commented Dec 22, 2024

右键作用是快进10s,右键长按作用是加速播放,但在按下右键到判断是右键长按间有一段时间空隙,在这时间内松开右键时没能快进10s,这是希望的设计吗。我尝试引入一个bool变量能解决这个问题,但不知这是否是需要的。

这是因为设置倍速是需要时间的,这一段空隙实际上已经触发了长按倍速,但是松手太快了 KeyRepeatEvent 还没开始工作就触发了 KeyUpEvent,逻辑是没有问题的。想要修改这个行为最简单的办法就是增加 keyShortPressTimer 的持续时间,让他比 flutter 官方的 KeyRepeatEvent 时间更长就行,可以观察到官方设置的时间大概是 500ms,比它长就行

image

@Predidit
Copy link
Owner

@xxfttkx

可以这样改,但似乎没什么必要。这也不是最佳实践。

这里的最佳实践应该是 stream ,但是 media-kit 的 stream 有一些小问题。

当 seek 发生后不会立即更改当前 position ,而是缓存完成后更改,这也会导致进度条 seek 时的闪烁,这一问题可以用 media-kit 示例播放网络流媒体时复现。

最近我试试能不能在我们的 media-kit 分支中解决这一问题。

@xxfttkx
Copy link
Contributor Author

xxfttkx commented Dec 22, 2024

这是因为设置倍速是需要时间的,这一段空隙实际上已经触发了长按倍速,但是松手太快了 KeyRepeatEvent 还没开始工作就触发了 KeyUpEvent,逻辑是没有问题的。想要修改这个行为最简单的办法就是增加 keyShortPressTimer 的持续时间,让他比 flutter 官方的 KeyRepeatEvent 时间更长就行,可以观察到官方设置的时间大概是 500ms,比它长就行

@ErBWs
我的想法是取消keyShortPressTimer,当右方向键抬起时只需判断有没有进行过加速然后进行取消加速或+10s

@ErBWs
Copy link
Contributor

ErBWs commented Dec 22, 2024

这是可行的,实际上可以直接利用 showPlaySpeed 进行判断

@xxfttkx
Copy link
Contributor Author

xxfttkx commented Dec 22, 2024

这是可行的,实际上可以直接利用 showPlaySpeed 进行判断

@ErBWs
那稍后我来提交pr吧

@xxfttkx
Copy link
Contributor Author

xxfttkx commented Dec 22, 2024

@xxfttkx

可以这样改,但似乎没什么必要。这也不是最佳实践。

这里的最佳实践应该是 stream ,但是 media-kit 的 stream 有一些小问题。

当 seek 发生后不会立即更改当前 position ,而是缓存完成后更改,这也会导致进度条 seek 时的闪烁,这一问题可以用 media-kit 示例播放网络流媒体时复现。

最近我试试能不能在我们的 media-kit 分支中解决这一问题。

@Predidit
进度条的控制不是由playerController.currentPosition决定吗,seek、stream 这方面我不是很懂,那就先保持这样吧

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

3 participants