diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 77cb84f6..e9ce2c5e 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -1532,10 +1532,11 @@ function App() { const toggleSettings = useCallback(() => setSettingsVisible((val) => !val), []); const seekClosestKeyframe = useCallback((direction: number) => { - const time = findNearestKeyFrameTime({ time: getRelevantTime(), direction }); + const sigma = detectedFps ? (1 / detectedFps) : 0.1; // because we don't want it to find the keyframe we're currently at. + const time = findNearestKeyFrameTime({ time: getRelevantTime() + direction * sigma, direction }); if (time == null) return; seekAbs(time); - }, [findNearestKeyFrameTime, getRelevantTime, seekAbs]); + }, [detectedFps, findNearestKeyFrameTime, getRelevantTime, seekAbs]); const onTimelineWheel = useTimelineScroll({ wheelSensitivity, mouseWheelZoomModifierKey, mouseWheelFrameSeekModifierKey, mouseWheelKeyframeSeekModifierKey, invertTimelineScroll, zoomRel, seekRel, shortStep, seekClosestKeyframe }); diff --git a/src/renderer/src/components/ExportConfirm.tsx b/src/renderer/src/components/ExportConfirm.tsx index d03e0add..3d37ecc4 100644 --- a/src/renderer/src/components/ExportConfirm.tsx +++ b/src/renderer/src/components/ExportConfirm.tsx @@ -170,11 +170,12 @@ function ExportConfirm({ const areWeCuttingProblematicStreams = areWeCutting && mainCopiedThumbnailStreams.length > 0; const haveSegmentWithProblematicKeyframe = useMemo(() => { - if (neighbouringKeyFrames.length === 0) return false; + if (neighbouringKeyFrames.length === 0) return false; // we don't know return segmentsToExport.some(({ start, end }) => { - const previousKeyframeTime = findNearestKeyFrameTime({ time: start, direction: -1 }) ?? 0; + const nearestPreviousKeyframeTime = findNearestKeyFrameTime({ time: start, direction: -1 }) ?? 0; + console.log({start,end,nearestPreviousKeyframeTime}) const segmentDuration = end - start; - const estimatedExportedSegmentDuration = end - previousKeyframeTime; + const estimatedExportedSegmentDuration = end - nearestPreviousKeyframeTime; // if estimated actual output length of segment is more than 1.5 times the intended segment duration, then we consider it problematic and warn the user about it. return estimatedExportedSegmentDuration > segmentDuration * 1.5; }); diff --git a/src/renderer/src/ffmpeg.ts b/src/renderer/src/ffmpeg.ts index e44e6521..e2820d39 100644 --- a/src/renderer/src/ffmpeg.ts +++ b/src/renderer/src/ffmpeg.ts @@ -191,9 +191,8 @@ export function getSafeCutTime(frames: Frame[], cutTime: number, nextMode: boole return frames[index - 1]!.time; } -export function findNearestKeyFrameTime({ frames, time, direction, fps }: { frames: Frame[], time: number, direction: number, fps: number | undefined }) { - const sigma = fps ? (1 / fps) : 0.1; - const keyframes = frames.filter((f) => f.keyframe && (direction > 0 ? f.time > time + sigma : f.time < time - sigma)); +export function findNearestKeyFrameTime({ frames, time, direction }: { frames: Frame[], time: number, direction: number }) { + const keyframes = frames.filter((f) => f.keyframe && (direction > 0 ? f.time >= time : f.time <= time)); if (keyframes.length === 0) return undefined; const nearestKeyFrame = sortBy(keyframes, (keyframe) => (direction > 0 ? keyframe.time - time : time - keyframe.time))[0]; if (!nearestKeyFrame) return undefined; diff --git a/src/renderer/src/hooks/useKeyframes.ts b/src/renderer/src/hooks/useKeyframes.ts index 4e14b792..3cca5a6d 100644 --- a/src/renderer/src/hooks/useKeyframes.ts +++ b/src/renderer/src/hooks/useKeyframes.ts @@ -42,7 +42,7 @@ function useKeyframes({ keyframesEnabled, filePath, commandedTime, videoStream, return map; }, [detectedFps, neighbouringKeyFrames]); - const findNearestKeyFrameTime = useCallback(({ time, direction }: { time: number, direction: number }) => ffmpegFindNearestKeyFrameTime({ frames: neighbouringKeyFrames, time, direction, fps: detectedFps }), [neighbouringKeyFrames, detectedFps]); + const findNearestKeyFrameTime = useCallback(({ time, direction }: { time: number, direction: number }) => ffmpegFindNearestKeyFrameTime({ frames: neighbouringKeyFrames, time, direction }), [neighbouringKeyFrames]); useEffect(() => setNeighbouringKeyFrames({}), [filePath, videoStream]);