What 2.x announced for 3.0: the two deprecations in contract --json's deprecated list
(Python 3.9 since 2.10.9, FFmpeg 5.x since 2.14.0), and the cut.py defaults and key meanings
recorded under "Decided for 3.0" in docs/design-decisions.md. No new tool; tool count still 42.
docs/contract.md "What 3.0 changed" is the migration table; contract --json lists the removals
under removed with the version that deprecated each, and deprecated is empty again.
contract_version is 2.0. 3.0.0 ships before the 90-day half of the deprecation window passed;
the waiver is written in docs/contract.md.
Added
probereports the source's start timecode:timecode: {value, drop_frame, source}, from the
video stream'stimecodetag, then atmcddata stream, then the container (nulls when none
carries one). Additive; requested by nle-bridge-skill for OTIO/EDL/FCP7 source timecodes.
Removed
- Running on FFmpeg 5.x (deprecated in 2.14.0).
requirements.ffmpegandffprobeare>=6.1.
Every tool refuses an ffmpeg/ffprobe whose version it reads as older than 6.1 (kind: missing_tool,error.reason: ffmpeg_unsupported, with install steps), instead of failing later
on an option the build lacks; a git or vendor build whose version cannot be read is not refused.
doctorlists it in a newunsupportedkey and reportsok: false; the npx installer prints the
same line. The 5.x-only spellings (drawtext's single-valueboxborderw, notext_align) and
CI's FFmpeg 5.1.1 static job are gone. - Running on Python 3.9 (deprecated in 2.10.9).
requirements.pythonis>=3.10. The npx
installer skips an older interpreter (and warns when it finds no 3.10+);doctorreports an older
one as unsupported (ok: false). CI's floor job is 3.10.
Changed
cut.pykeeps the MP4 edit list on a single.mp4/.movstream copy by default, so the
picture and the sound start at--start(2.x shifted the timestamps with-avoid_negative_ts make_zeroand showed the keyframe's pre-roll).--no-edit-listrestores 2.x;--edit-listis
still accepted.cut.pyre-encodes an SDR HEVC source as HEVC by default (2.x: x264).--no-keep-hevcrestores
2.x;--keep-hevcis still accepted;--codecstill overrides both.cut.py --vfr-guarddefaults tosampled: a stream copy is refused on measured packet timing,
not on the whole-file average rate (2.x'saverage, still available).cut.py'sprecisionis the least exact segment's (it equalsleast_exact_precision, which
stays); 2.x reported the whole run's formula, which differed only for an audio-only--segments
join of copied and re-encoded parts.keyframe_snappedequalsstart_snapped: true only when a
copied start really moved,nullunder--dry-run(2.x: true for every stream copy end to end).
Fixed
cut.py --vfr-guard sampled(now the default) measured a constant-frame-rate MPEG-TS as
variable and re-encoded it: a seek into TS lands mid-GOP, and the frame stored before the
landing point read as a dropped frame. A seeked window is judged from its first keyframe on.
What's Changed
- 3.0.0: require FFmpeg 6.1+ and Python 3.10+; apply the cut.py defaults decided for 3.0 by @kajisho5 in #387
Full Changelog: v2.24.1...v3.0.0