diff --git a/lib/pages/danmaku/view.dart b/lib/pages/danmaku/view.dart index 224525754..e127ff28a 100644 --- a/lib/pages/danmaku/view.dart +++ b/lib/pages/danmaku/view.dart @@ -161,9 +161,9 @@ class _PlDanmakuState extends State { hideTop: playerController.blockTypes.contains(5), hideScroll: playerController.blockTypes.contains(2), hideBottom: playerController.blockTypes.contains(4), - duration: playerController.danmakuDuration ~/ + duration: playerController.danmakuDuration / playerController.playbackSpeed, - staticDuration: playerController.danmakuStaticDuration ~/ + staticDuration: playerController.danmakuStaticDuration / playerController.playbackSpeed, strokeWidth: playerController.strokeWidth, lineHeight: playerController.danmakuLineHeight, diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 812db8e76..8a33f149c 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -180,10 +180,10 @@ class _LiveRoomPageState extends State hideTop: plPlayerController.blockTypes.contains(5), hideScroll: plPlayerController.blockTypes.contains(2), hideBottom: plPlayerController.blockTypes.contains(4), - duration: plPlayerController.danmakuDuration ~/ + duration: plPlayerController.danmakuDuration / plPlayerController.playbackSpeed, staticDuration: - plPlayerController.danmakuStaticDuration ~/ + plPlayerController.danmakuStaticDuration / plPlayerController.playbackSpeed, strokeWidth: plPlayerController.strokeWidth, lineHeight: plPlayerController.danmakuLineHeight, diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index cc587c510..120d443ee 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -272,8 +272,8 @@ class _VideoDetailPageState extends State // 结束播放退出全屏 if (!notExitFlag && autoExitFullscreen) { plPlayerController!.triggerFullScreen(status: false); - if (plPlayerController!.doubleSpeedStatus.value) { - plPlayerController!.setDoubleSpeedStatus(false); + if (plPlayerController!.longPressStatus.value) { + plPlayerController!.setLongPressStatus(false); } if (plPlayerController!.controlsLock.value) { plPlayerController!.onLockControl(false); diff --git a/lib/pages/video/detail/view_v.dart b/lib/pages/video/detail/view_v.dart index 9c391cf34..baa681477 100644 --- a/lib/pages/video/detail/view_v.dart +++ b/lib/pages/video/detail/view_v.dart @@ -302,8 +302,8 @@ class _VideoDetailPageVState extends State // 结束播放退出全屏 if (!notExitFlag && autoExitFullscreen) { plPlayerController!.triggerFullScreen(status: false); - if (plPlayerController!.doubleSpeedStatus.value) { - plPlayerController!.setDoubleSpeedStatus(false); + if (plPlayerController!.longPressStatus.value) { + plPlayerController!.setLongPressStatus(false); } if (plPlayerController!.controlsLock.value) { plPlayerController!.onLockControl(false); diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index 2876b7c57..ef577d1f4 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -1520,7 +1520,7 @@ class _HeaderControlState extends State { danmakuController?.updateOption( danmakuController.option.copyWith( duration: - danmakuDuration ~/ widget.controller.playbackSpeed), + danmakuDuration / widget.controller.playbackSpeed), ); } catch (_) {} } @@ -1534,7 +1534,7 @@ class _HeaderControlState extends State { try { danmakuController?.updateOption( danmakuController.option.copyWith( - staticDuration: danmakuStaticDuration ~/ + staticDuration: danmakuStaticDuration / widget.controller.playbackSpeed), ); } catch (_) {} diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index c73fb31a4..4578f223a 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -65,6 +65,7 @@ class PlPlayerController { final Rx _playerCount = Rx(0); + late double lastPlaybackSpeed = 1.0; final Rx _playbackSpeed = 1.0.obs; final Rx _longPressSpeed = 2.0.obs; final Rx _currentVolume = 1.0.obs; @@ -74,7 +75,7 @@ class PlPlayerController { final Rx _showControls = false.obs; final Rx _showVolumeStatus = false.obs; final Rx _showBrightnessStatus = false.obs; - final Rx _doubleSpeedStatus = false.obs; + final Rx _longPressStatus = false.obs; final Rx _controlsLock = false.obs; final Rx _isFullScreen = false.obs; // 默认投稿视频格式 @@ -232,7 +233,7 @@ class PlPlayerController { Rx get flipY => _flipY; /// 是否长按倍速 - Rx get doubleSpeedStatus => _doubleSpeedStatus; + Rx get longPressStatus => _longPressStatus; Rx isBuffering = true.obs; @@ -277,7 +278,6 @@ class PlPlayerController { late double danmakuDuration; late double danmakuStaticDuration; late List speedList; - double? defaultDuration; late bool enableAutoLongPressSpeed = false; late bool enableLongShowControl; double subtitleFontScale = 1.0; @@ -806,11 +806,7 @@ class PlPlayerController { if (videoType.value == 'live') { await setPlaybackSpeed(1.0); } else { - if (_playbackSpeed.value != 1.0) { - await setPlaybackSpeed(_playbackSpeed.value); - } else { - await setPlaybackSpeed(1.0); - } + await setPlaybackSpeed(_playbackSpeed.value); } getVideoFit(); // if (_looping) { @@ -1036,23 +1032,25 @@ class PlPlayerController { /// 设置倍速 Future setPlaybackSpeed(double speed) async { - /// TODO _duration.value丢失 - await _videoPlayerController?.setRate(speed); - try { - DanmakuOption currentOption = danmakuController!.option; - defaultDuration ??= - currentOption.duration.toDouble() * _playbackSpeed.value; - DanmakuOption updatedOption = - currentOption.copyWith(duration: defaultDuration! ~/ speed); - danmakuController!.updateOption(updatedOption); - if (speed == 1.0) { - defaultDuration = null; - } - } catch (_) {} - // fix 长按倍速后放开不恢复 - if (!doubleSpeedStatus.value) { - _playbackSpeed.value = speed; + lastPlaybackSpeed = playbackSpeed; + + if (speed == playbackSpeed) { + return; } + + await _videoPlayerController?.setRate(speed); + if (danmakuController != null) { + DanmakuOption currentOption = danmakuController!.option; + double defaultDuration = currentOption.duration * lastPlaybackSpeed; + double defaultStaticDuration = + currentOption.staticDuration * lastPlaybackSpeed; + DanmakuOption updatedOption = currentOption.copyWith( + duration: defaultDuration / speed, + staticDuration: defaultStaticDuration / speed, + ); + danmakuController!.updateOption(updatedOption); + } + _playbackSpeed.value = speed; } // 还原默认速度 @@ -1339,27 +1337,27 @@ class PlPlayerController { } /// 设置长按倍速状态 live模式下禁用 - void setDoubleSpeedStatus(bool val) async { + void setLongPressStatus(bool val) async { if (videoType.value == 'live') { return; } if (controlsLock.value) { return; } - if (_doubleSpeedStatus.value == val) { + if (_longPressStatus.value == val) { return; } if (val) { if (playerStatus.status.value == PlayerStatus.playing) { - _doubleSpeedStatus.value = val; + _longPressStatus.value = val; HapticFeedback.lightImpact(); await setPlaybackSpeed( enableAutoLongPressSpeed ? playbackSpeed * 2 : longPressSpeed); } } else { // debugPrint('$playbackSpeed'); - _doubleSpeedStatus.value = val; - await setPlaybackSpeed(playbackSpeed); + _longPressStatus.value = val; + await setPlaybackSpeed(lastPlaybackSpeed); } } diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index ea070a5bf..5a001ec8b 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -946,7 +946,7 @@ class _PLVideoPlayerState extends State translation: const Offset(0.0, 0.3), // 上下偏移量(负数向上偏移) child: AnimatedOpacity( curve: Curves.easeInOut, - opacity: plPlayerController.doubleSpeedStatus.value ? 1.0 : 0.0, + opacity: plPlayerController.longPressStatus.value ? 1.0 : 0.0, duration: const Duration(milliseconds: 150), child: Container( alignment: Alignment.center, @@ -959,7 +959,7 @@ class _PLVideoPlayerState extends State child: Center( child: Obx( () => Text( - '${plPlayerController.enableAutoLongPressSpeed ? plPlayerController.playbackSpeed * 2 : plPlayerController.longPressSpeed}倍速中', + '${plPlayerController.enableAutoLongPressSpeed ? (plPlayerController.longPressStatus.value ? plPlayerController.lastPlaybackSpeed : plPlayerController.playbackSpeed) * 2 : plPlayerController.longPressSpeed}倍速中', style: const TextStyle(color: Colors.white, fontSize: 13), ), @@ -1255,10 +1255,10 @@ class _PLVideoPlayerState extends State doubleTapFuc(type); }, onLongPressStart: (LongPressStartDetails detail) { - plPlayerController.setDoubleSpeedStatus(true); + plPlayerController.setLongPressStatus(true); }, onLongPressEnd: (LongPressEndDetails details) { - plPlayerController.setDoubleSpeedStatus(false); + plPlayerController.setLongPressStatus(false); }, ), ), diff --git a/pubspec.lock b/pubspec.lock index 28ba17ef4..07f2adfe4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -252,7 +252,7 @@ packages: description: path: "." ref: main - resolved-ref: "5391050a7e070a85234762edadc93298c6ed6523" + resolved-ref: "23269eb39f4374b7cbf7154e47918213e174373d" url: "https://github.com/bggRGjQaUbCoE/canvas_danmaku.git" source: git version: "0.2.6"