Jump cut real test - run: 2026-10-26 01:54 UTC host: Linux 6.8.0-139-generic x86_64 ffmpeg: ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers === 1. source clip (Wikimedia Commons, CC0) === $ ffprobe -v error -show_entries format=duration,size,format_name -show_entries stream=index,codec_name,codec_type,width,height,r_frame_rate -of default=noprint_wrappers=1 '/home/ubuntu/rt/jump2b/src8.webm' index=0 codec_name=vp8 codec_type=video width=1440 height=1080 r_frame_rate=25/1 index=1 codec_name=vorbis codec_type=audio r_frame_rate=0/0 format_name=matroska,webm duration=8.004000 size=4237928 exit=0 === 2. our working file: constant frame rate, 16:9, H.264 === $ ffmpeg -v error -i '/home/ubuntu/rt/jump2b/src8.webm' -an -vf 'fps=30,scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2' -c:v libx264 -crf 22 -preset medium clip.mp4 -y exit=0 $ ffprobe -v error -show_entries format=duration,size,bit_rate -show_entries stream=codec_name,width,height,r_frame_rate,nb_frames -of default=noprint_wrappers=1 clip.mp4 codec_name=h264 width=1280 height=720 r_frame_rate=30/1 nb_frames=240 duration=8.000000 size=569934 bit_rate=569934 exit=0 === 3. make the jump cut: take 3.0 s to 4.5 s out of the middle === The cut joins 0.0-3.0 s to 4.5-8.0 s in one re-encode, so the seam is one frame wide. $ ffmpeg -v error -i clip.mp4 -filter_complex '[0:v]split[v1][v2];[v1]trim=start=0:end=3,setpts=PTS-STARTPTS[a];[v2]trim=start=4.5,setpts=PTS-STARTPTS[b];[a][b]concat=n=2:v=1:a=0[v]' -map '[v]' -c:v libx264 -crf 22 -preset medium jumpcut.mp4 -y exit=0 $ ffprobe -v error -show_entries format=duration,size,bit_rate -show_entries stream=codec_name,width,height,r_frame_rate,nb_frames -of default=noprint_wrappers=1 jumpcut.mp4 codec_name=h264 width=1280 height=720 r_frame_rate=30/1 nb_frames=195 duration=6.500000 size=494257 bit_rate=608316 exit=0 === 4. is the cut really there? (frame to frame difference of the picture) === For every frame we take the difference with the frame before it and read the average luminance of that difference. A normal frame change in this clip gives a small number; the cut gives one large spike. The YAVG values are written to per-frame-*.txt. $ ffmpeg -v error -i clip.mp4 -vf 'tblend=all_mode=difference,signalstats,metadata=print:key=lavfi.signalstats.YAVG:file=per-frame-source.txt' -f null - exit=0 $ ffmpeg -v error -i jumpcut.mp4 -vf 'tblend=all_mode=difference,signalstats,metadata=print:key=lavfi.signalstats.YAVG:file=per-frame-jumpcut.txt' -f null - exit=0 source: frames=239 median=0.96 max=2.26 top5: 0.267s=2.26, 4.933s=2.02, 0.333s=2.00, 5.433s=1.93, 4.867s=1.85 around the seam: 2.600s=0.86, 2.633s=0.85, 2.667s=0.88, 2.700s=0.03, 2.733s=0.91, 2.767s=0.91, 2.800s=0.83, 2.833s=0.87, 2.867s=0.90, 2.900s=0.02, 2.933s=0.85, 2.967s=0.90, 3.000s=0.86, 3.033s=0.67, 3.067s=0.92, 3.100s=0.03, 3.133s=0.91, 3.167s=0.78, 3.200s=0.85, 3.233s=0.88, 3.267s=0.90, 3.300s=0.02, 3.333s=0.82, 3.367s=0.97, 3.400s=0.86 jump cut: frames=194 median=0.94 max=3.13 top5: 3.000s=3.13, 0.267s=2.25, 3.433s=2.00, 0.333s=2.00, 3.933s=1.92 around the seam: 2.600s=0.85, 2.633s=0.83, 2.667s=0.87, 2.700s=0.03, 2.733s=0.90, 2.767s=0.90, 2.800s=0.82, 2.833s=0.86, 2.867s=0.88, 2.900s=0.02, 2.933s=0.83, 2.967s=0.87, 3.000s=3.13, 3.033s=1.32, 3.067s=1.41, 3.100s=1.32, 3.133s=1.35, 3.167s=1.38, 3.200s=0.02, 3.233s=1.34, 3.267s=1.25, 3.300s=1.41, 3.333s=1.50, 3.367s=1.80, 3.400s=0.02 === 5. frames around the seam (for the diagram) === $ ffmpeg -v error -ss 2.90 -i jumpcut.mp4 -frames:v 1 -vf scale=320:180 frame-before.png -y exit=0 $ ffmpeg -v error -ss 3.02 -i jumpcut.mp4 -frames:v 1 -vf scale=320:180 frame-after.png -y exit=0 === 6. what we ship === -rw-rw-r-- 1 ubuntu ubuntu 569934 Oct 26 01:54 clip.mp4 -rw-rw-r-- 1 ubuntu ubuntu 494257 Oct 26 01:54 jumpcut.mp4 === done === === 7. the same cut with the site's own tools (production site koldflux.com, headless Chromium, 2026-10-26) === $ node scenario-trim.cjs clip.mp4 0 3 tool-head.mp4 tool-head.mp4: h264 1280x720 30 fps, 90 frames, duration 3.000000 s, size 154565 bytes $ node scenario-trim.cjs clip.mp4 4.5 8 tool-tail.mp4 tool-tail.mp4: h264 1280x720 30 fps, 105 frames, duration 3.500000 s, size 202569 bytes $ node scenario-merge.cjs tool-head.mp4 tool-tail.mp4 tool-jumpcut.mp4 tool-jumpcut.mp4: h264 1920x1080 30 fps, 195 frames, duration 6.500000 s, size 571147 bytes, bit_rate 702950 Frame difference of the browser-tool result (same method as section 4): frames=194 median=0.90 max=3.16 top5: 3.000s=3.16, 0.267s=2.21, 0.333s=1.97, 3.433s=1.93, 3.933s=1.87 The seam is at 3.000 s in the browser result, the same second as the ffmpeg result (3.13). Note: the working file clip.mp4 has no sound (we removed the source clip's audio with -an); the source is the first 8 s of a 14 s CC0 clip.