feat: 支持长按右键/D键二倍速播放与视频AB循环

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-11-04 02:00:05 +08:00
co-authored by Cursor
parent bcf1e6e349
commit 11d9d35002
8 changed files with 431 additions and 37 deletions
@@ -31,6 +31,7 @@ function sumDurations(durations: number[], end: number): number {
interface UseImageCarouselProps {
images: ImageData["images"];
isPlaying: boolean;
playbackRate?: number;
loopMode: LoopMode;
neighbors: Neighbors;
volume: number;
@@ -63,6 +64,7 @@ export interface UseImageCarouselReturn {
export function useImageCarousel({
images,
isPlaying,
playbackRate = 1,
loopMode,
neighbors,
volume,
@@ -375,8 +377,10 @@ export function useImageCarousel({
return;
}
const safeRate = playbackRate > 0 ? playbackRate : 1;
const now = performance.now();
const currentSegmentDuration = segmentDurations[idx] ?? fallbackDuration;
const currentSegmentDuration =
(segmentDurations[idx] ?? fallbackDuration) / safeRate;
segStartRef.current = now - segProgressRef.current * currentSegmentDuration;
const tick = (): void => {
@@ -386,7 +390,8 @@ export function useImageCarousel({
const ts = performance.now();
const start = segStartRef.current ?? ts;
const activeIdx = idxRef.current;
const duration = segmentDurations[activeIdx] ?? fallbackDuration;
const duration =
(segmentDurations[activeIdx] ?? fallbackDuration) / safeRate;
const elapsed = ts - start;
if (elapsed >= duration) {
@@ -416,6 +421,7 @@ export function useImageCarousel({
isCurrentAnimated,
isCurrentStaticReady,
isPlaying,
playbackRate,
segmentDurations,
syncProgress,
totalDurationMs,