Mikael Finstad 1 month ago
parent 2605308ec8
commit 26053079c9
No known key found for this signature in database
GPG Key ID: 25AB36E3E81CBC26

@ -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 });

@ -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;
});

@ -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;

@ -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]);

Loading…
Cancel
Save