Repository navigation
Releases: Breakthrough/PySceneDetect
Release list
PySceneDetect v0.7.2
Release Notes
PySceneDetect 0.7.2 ships improved defaults for the histogram and perceptual hash detectors, adds PyAV 19 support, and fixes several timing and output bugs. Default output of detect-hist and detect-hash will change in this release due to improved default values.
CLI Changes
- [improvement]
HistogramDetector(detect-hist) defaultthresholdchanged from 0.05 to 0.20 and defaultbinsfrom 256 to 128, calibrated from the benchmarks. Output for this detector will change if you are not setting both parameters explicitly. #559- Use
detect-hist -t 0.05 -b 256orHistogramDetector(threshold=0.05, bins=256)to restore the previous behavior.
- Use
- [improvement]
HashDetector(detect-hash) defaultthresholdchanged from 0.395 to 0.35 and defaultsizefrom 16 to 8, calibrated from the benchmarks. Output for this detector will change if you are not setting both parameters explicitly. #559- Use
detect-hash -t 0.395 -s 16orHashDetector(threshold=0.395, size=16)to restore the previous behavior.
- Use
- [improvement]
detect-thresholdnow ignores fade-outs shorter than0.1sby default. Use--min-out-length 0to restore the previous behavior. The API default remains0#278 - [feature] Added
save-keyframescommand to export detected cuts using# keyframe format v1for Aegisub-compatible tools #534. Frame numbers are currently approximate for VFR input #569 - [feature] Add
--min-out-length/min_out_lengthtodetect-threshold/ThresholdDetector, which requires that fades stay below the threshold for the given duration #278 - [general]
-f,--frame-rate, and--framerateare now aliases of the same CLI option, and all forms appear in help and documentation. If multiple forms are given, the last value is used #548 - [bugfix] Progress bar now reaches 100% when processing variable framerate (VFR) videos, with both the OpenCV and PyAV backends #561
- [bugfix] Fix
AdaptiveDetector/detect-adaptiveemitting scenes shorter thanmin_scene_lenwhenwindow_widthis large, by applying the minimum-length check to the emitted (target) frame instead of the current frame #408
API Changes
- [api] Legacy
framerateargument aliases inFrameTimecode,open_video(), and the video backends now emit aDeprecationWarning; useframe_rateinstead. When both forms are provided,frame_ratetakes precedence #548 - [api]
write_scene_list()now also accepts a path (strorpathlib.Path) as the first argument in addition to an open file handle; paths are opened and closed automatically #523 - [api] Scene-list output functions for EDL, FCPXML, FCP7 XML, and OTIO now accept an open text file handle, a string path, or a
pathlib.Path; paths are opened and closed automatically #567 - [bugfix]
ThresholdDetector/detect-thresholdwith methodCEILINGnow classifies the first frame with theCEILINGrule instead of theFLOORrule, which anchored a leading fade one frame late and could emit a spurious cut at the first frame (thanks @MuhammadBilalKhan267) - [bugfix] Fix
min_scene_lengiven in frames dropping cuts that are exactlymin_scene_lenframes apart at NTSC framerates (e.g. 29.97 fps), by comparing frame counts instead of converting to seconds #577 - [bugfix] Fix
TypeErrorwhen opening videos with thepyavbackend on PyAV 19.0 or newer (PyAV 19 is now supported) - [bugfix] Fix
pyavbackend duration calculation fallback - [bugfix] Fix
pyavbackend not releasing the file handle it opened when the stream is garbage collected, which emitted aResourceWarningunderpython -X dev#568 - [bugfix] Work around an intermittent segfault on exit with the OpenCV backend on Windows when opening PNG image sequences with
opencv-python4.14 or 5.0 (upstream: opencv/opencv#30017) #575
Packaging
- [general] The Windows distribution now bundles PyAV 19 and FFmpeg 9.0
- [general] The
scenedetect-corepackage introduced in 0.7.1 has been discontinued, and its only release (0.7.1) yanked from PyPI. Existingscenedetect-coreinstalls keep working but will not receive updates. Install eitherscenedetectorscenedetect-headless. #558
PySceneDetect v0.7.1
Release Notes
PySceneDetect 0.7.1 adds support for concatenating multiple videos, along with several stability and robustness fixes for the PyAV and OpenCV backends.
CLI Changes
- [feature]
split-videohas a new--expandflag: when scenes are detected within a time window (-s/-e), the first output clip is extended back to the start of the video and the last clip is extended forward to the end, so no footage outside the analysis window is dropped #115
API Changes
- [feature]
scenedetect.detect()now accepts abackendkeyword argument ("opencv","pyav", or"moviepy") similar toopen_video. Defaults to"opencv", matching prior behavior. - [feature] Add
expand_scenes_to_bounds()helper inscenedetect.scene_managerto extend a scene list so the first scene starts at a given lower bound and the last scene ends at a given upper bound - [feature]
VideoStreamnow provides a public read-onlydecode_failuresproperty reporting the number of frames that failed to decode and were skipped (defaults to 0; populated by the OpenCV and PyAV backends) - [feature] Add
VideoStreamConcat(scenedetect.backends.concat) which concatenates multiple videos into a single continuous stream with a monotonic PTS timeline;open_video()anddetect()now accept a list of paths.VideoStreamConcat.map_span()maps spans of the global timeline back to per-source local times - [bugfix] The PyAV backend (
VideoStreamAv) now skips corrupt frames duringread()and continues decoding instead of failing, giving up only after 8 consecutive decode failures (matching the OpenCV backend's tolerance behavior) - [bugfix] The PyAV backend now normalizes presentation times by the stream start time, so files with a delayed start (e.g. from edit lists) report the first frame at
position0, consistent with other backends and withseek() - [bugfix] Comparisons between two
FrameTimecodeobjects that both carry exact presentation times (e.g. positions from VFR videos) and share the same frame rate are now performed exactly usingptsandtime_baseinstead of rounded frame numbers. Previously, distinct frames in VFR sections could compare equal or fail strict ordering when their times rounded to the same approximate frame number. Comparisons involving frame- or seconds-based timecodes, plain values (int/float/str), or differing frame rates are unchanged - [bugfix] Fix image sequence inputs when using OpenCV 5.0
Packaging
- [general]
scenedetectandscenedetect-headlessare unchanged: they continue to ship the full program (library + CLI) withopencv-python/opencv-python-headlessrespectively. Both packages provide the samescenedetectmodule (install or depend only one) - [feature] Official Docker images are now published to the GitHub Container Registry with the full CLI, all backends, and external tools (ffmpeg, mkvmerge) included, thanks @FNGarvin #537
- Example usage (process a video in the current directory):
docker run --rm -v "$(pwd):/files" ghcr.io/breakthrough/pyscenedetect -i /files/video.mp4 detect-adaptive split-video -o /files- [general] The Windows distribution now bundles OpenCV 5.0, PyAV 18, and FFmpeg 8.1.2. The Windows and Docker builds also override Pillow to 12.3.0 for upstream security fixes (moviepy#2553)
General
- [general] Benchmark results are now published on the website (scenedetect.com/benchmarks), including accuracy at default settings and parameter sweep curves for each detector
PySceneDetect v0.7
Release Notes
PySceneDetect 0.7 is a major breaking release which overhauls how timestamps are handled. This allows PySceneDetect to properly process variable framerate (VFR) videos. A significant amount of technical debt has been addressed, including removal of deprecated or overly complicated APIs.
Care was taken to minimize changes for most common API uses, however more advanced use cases may run into breaking changes. Please review the Migration Guide when updating from v0.6. Minimum supported Python version is now Python 3.10.
CLI Changes
- [feature] VFR videos are handled correctly by the OpenCV and PyAV backends, and should work correctly with default parameters
- [feature] All CLI options which used to accept frame numbers only now accept seconds (e.g.
0.6s) and timecodes (e.g.00:00:00.600) #531 - [feature] New
save-fcpcommand allows exporting in Final Cut Pro format (FCP7/FCPX) #156 - [feature] New
save-qpcommand writes a QP file with scene boundary frame numbers, suitable for forcing keyframes at scene cuts in x264/x265 #448 - [feature] New
save-htmlcommand replaces the deprecatedexport-html; the prior command remains as an alias and emits a deprecation warning #518 - [feature] Add
save-edloption--start-timecode/-sto providde a custom start timecode for generated EDLs, supports SMPTEHH:MM:SS:FFor 8-digitHHMMSSFFinput #515 - [bugfix] Fix floating-point precision error in
save-otiooutput where frame values near integer boundaries (e.g.90.00000000000001) were serialized with spurious precision - [bugfix] Add mitigation for transient
OSErrorin the MoviePy backend as it is susceptible to subprocess pipe races on slow or heavily loaded systems #496 - [feature] The MoviePy backend now supports overriding the source frame rate via
-f/--frame-rate(and theVideoStreamMoviePy(frame_rate=...)API), bringing it in line with the OpenCV and PyAV backends - [bugfix]
detect-thresholdcut frame numbers are now backend-deterministic; previously the cut could differ by 1 frame between PyAV and OpenCV when the fade midpoint landed on a.5rounding boundary (PyAV uses sub-microsecond PTS, OpenCV uses millisecond-truncatedCAP_PROP_POS_MSEC) - [breaking] Remove deprecated
-d/--min-delta-hsvoption fromdetect-adaptivecommand (use-c/--min-content-valinstead) - [breaking] Rename
-f/--framerateto-f/--frame-rateas part of VFR overhaul (legacy--framerateform is preserved as a hidden alias but will be removed in v0.8) - [general] Support
SCENEDETECT_DEBUGenvironment variable to control how exceptions and debugging are handled. Unhandled exceptions andCtrl+Cnow produce a logger-formatted error message and exit cleanly with code 1 instead of dumping a raw Python traceback. SetSCENEDETECT_DEBUG=1to ensure all exceptions are re-raised instead of being logged. In both cases, the program will exit with a non-zero exit code.
API Changes
VFR & Timestamp Overhaul:
- Add
write_scene_list_edl,write_scene_list_fcpx,write_scene_list_fcp7, andwrite_scene_list_otioto thescenedetect.outputmodule sosave-edl,save-fcp, andsave-otiocan be invoked directly from Python (previously CLI-only) write_scene_list_edlaccepts an optionalstart_timecodeparameter (SMPTEHH:MM:SS:FFor 8-digitHHMMSSFF) that is added to every event's source and record columns #515- Add new
Timecodetype to represent frame timings in terms of the video's source timebase - Add
time_baseandptsproperties toFrameTimecodefor more accurate timing information - All backends (PyAV, OpenCV, MoviePy) now return PTS-backed timestamps from
VideoStream.position VideoStream.frame_ratenow returnsFractioninstead offloat- Framerates are now stored as rational
Fractionvalues (e.g.Fraction(24000, 1001)instead of23.976) to avoid float precision loss - Common NTSC rates (23.976, 29.97, 59.94) are automatically detected from float values
FrameTimecode.frame_numis now approximate for VFR video (based on PTS-derived time)- Add
frame_rateproperty (returns exactFraction) as the canonical replacement forframerate(returnsfloat) inFrameTimecodeandVideoStream- For CFR sources, both properties represent the same rate, i.e.
time_baseequals1 / frame_ratefor CFR sources #548
- For CFR sources, both properties represent the same rate, i.e.
- Add
frame_ratekeyword argument toopen_video()and theVideoStreamCv2,VideoCaptureAdapter,VideoStreamAv, andVideoStreamMoviePyconstructors as the canonical replacement forframerate#548; acceptsfloat | Fraction | None. The legacyframeratekeyword is retained as a deprecated alias and is ignored whenframe_rateis provided - Add
equal_frame_rate(other)method as the canonical replacement forequal_framerate(fps)
General:
- Type hints: audit and overhaul: first-party code is now clean with Pyright basic mode, migrated deprecated type hints to comply with PEP 585
- Code quality: expand static analysis rules, audit and cleanup existing suppressions
- Packaging: modernized to comply with PEP 621, make
opencv-pythona requirement, add separatescenedetect-headlessvariant instead
Detector Interface:
- Replace
frame_numparameter (int) withtimecode(FrameTimecode) inSceneDetectorinterface #168:- The detector interface:
SceneDetector.process_frame()andSceneDetector.post_process()(thepost_processsignature on the abstract base is now consistently typed asFrameTimecodeto match its concrete-detector overrides; the priorintannotation did not reflect the actual runtime value) - Statistics:
StatsManager.get_metrics(),StatsManager.set_metrics(), andStatsManager.metrics_exist()formally accept eitherFrameTimecodeorint(theintform is retained for compatibility with the deprecatedload_from_csv()path, which keys metrics by integer frame number)
- The detector interface:
StatsManager.load_from_csv()andsave_images()output_dirnow acceptos.PathLike(e.g.pathlib.Path) in addition tostrSceneManager.detect_scenes()durationandend_timeformally acceptint(frames),float(seconds),str(timecode), orFrameTimecode- matching the documented and runtime-supported behaviorSceneDetectoris now a Python abstract classSceneDetectorinstances can now assume they always have frame data to process whenprocess_frameis called- Remove
SceneDetector.is_processing_required()method - Remove
SceneDetector.stats_manager_requiredproperty, no longer required - Remove deprecated
SparseSceneDetectorinterface - Detector
min_scene_lenandsave_images()frame_marginarguments now accept seconds (float) and timecode strings (e.g."0.6s","00:00:00.600") in addition to a frame count (int); these are evaluated using the source video's timing for correct behavior on VFR videos #531
Module Reorganization:
scenedetect.scene_detectormoved toscenedetect.detectorscenedetect.frame_timecodemoved toscenedetect.common- Image/HTML/CSV export in
scenedetect.scene_managermoved toscenedetect.output#463 scenedetect.video_splittermoved toscenedetect.output.video#463
FrameTimecode:
- Add properties to access
frame_num,frame_rate, andsecondsinstead of getter methods frame_numandframe_rateare now read-only properties (construct a newFrameTimecodeto change them)- Remove
FrameTimecode.previous_frame()method - Deprecated functionality preserved from v0.6 now uses the
warningsmodule to emit runtime deprecation warnings, these features will be removed in v0.8 - Soft-deprecate
framerateproperty andequal_framerate()method via docstring; the legacy forms will continue to work until v0.8 when they will be upgraded toDeprecationWarningbefore removal in v0.9
Removals:
- Remove deprecated module
scenedetect.video_manager, use thescenedetect.open_video()function instead - Remove deprecated parameters
base_timecodeandvideo_managerfrom various functions - Remove deprecated
SceneManager.get_event_list()method - Remove deprecated
AdaptiveDetector.get_content_val()method (useStatsManagerinstead) - Remove deprecated
AdaptiveDetectorconstructor argmin_delta_hsv(usemin_content_valinstead) - Remove
advanceparameter fromVideoStream.read() - Remove
SceneDetector.stats_manager_requiredproperty, no longer required SceneDetectoris now a Python abstract class
Windows Distribution
- [general] Updates to Windows distributions:
- av 14.2.0 -> 17.0.1
- click 8.1.8 -> 8.2.1
- imageio-ffmpeg 0.6.0
- moviepy 2.1.2 -> 2.2.1
- numpy 2.2.3 -> 2.4.4
- opencv-python-headless 4.11.0.86 -> 4.13.0.92
- platformdirs 4.3.6 -> 4.9.6
- tqdm...
PySceneDetect v0.6.7
Release Notes
Fixes issues with importing EDL files into DaVinci Resolve and other editors, update ffmpeg.
Changelog
- [bugfix] Fix
save-edlend timestamp being too short by 1 frame #516 - [general] Updates to Windows distributions:
- ffmpeg 7.1 -> 8.0
v0.6.7.1 (PyPI only, no code changes) - 2025-09-24
- [dist] Fix version pinning to prevent incompatibility with third-party dependencies #521
PySceneDetect v0.6.6
Release Notes
PySceneDetect v0.6.6 introduces new output formats, which improve compatibility with popular video editors (e.g. DaVinci Resolve).
Changelog
- [feature] New
save-otiocommand supports saving scenes in OTIO format #497 - [feature] New
save-edlcommand supports saving scenes in EDL format CMX 3600 #495 - [bugfix] Fix incorrect help entries for short-form arguments which suggested invalid syntax #493
- [bugfix] Fix crash when using
split-videowith-m/--mkvmergeoption #473 - [bugfix] Fix incorrect default filename template for
split-videocommand with-m/--mkvmergeoption - [bugfix] Fix inconsistent filenames when using
split_video_mkvmerge() - [bugfix] Ensure auto-rotation is always enabled for
VideoStreamCv2as workaround for opencv#26795 - [general] The
export-htmlcommand is now deprecated, usesave-htmlinstead - [general] Updates to Windows distributions:
- av 13.1.0 -> 14.2.0
- click 8.1.7 -> 8.1.8
- imageio-ffmpeg 0.5.1 -> 0.6.0
- moviepy 2.1.1 -> 2.1.2
- numpy 2.1.3 -> 2.2.3
- opencv-python 4.10.0.84 -> 4.11.0.86
New Contributors
PySceneDetect v0.6.5
Release Notes
This release brings crop support, performance improvements to save-images, lots of bugfixes, and improved compatibility with MoviePy 2.0+.
Changelog
- [feature] Add ability to crop input video before processing #302 #449
- [cli] Add
--cropoption toscenedetectcommand and config file to crop video frames before scene detection - [api] Add
cropproperty toSceneManagerto crop video frames before scene detection
- [cli] Add
- [feature] Add ability to configure CSV separators for rows/columns in config file #423
- [feature] Add new
--showflag toexport-htmlcommand to launch browser after processing #442 - [improvement] Add new
threadingoption tosave-images/save_images()#456- Enabled by default, offloads image encoding and disk IO to separate threads
- Improves performance by up to 50% in some cases
- [improvement] The
export-htmlcommand now implicitly invokessave-imageswith default parameters- The output of the
export-htmlcommand will always use the result of thesave-imagescommand that precedes it
- The output of the
- [improvement]
save_to_csvnow works with paths frompathlib - [api] The
save_to_csvfunction now works correctly with paths from thepathlibmodule - [api] Add
col_separatorandrow_separatorargs towrite_scene_listfunction inscenedetect.scene_manager - [api] The MoviePy backend now works with MoviePy 2.0+
- [bugfix] Fix
SyntaxWarningdue to incorrect escaping #400 - [bugfix] Fix
ContentDetectorcrash when using callbacks #416 #420 - [bugfix] Fix
save-images/save_images()not working correctly with UTF-8 paths #450 - [bugfix] Fix crash when using
save-images/save_images()with OpenCV backend #455 - [bugfix] Fix new detectors not working with
default-detectorconfig option - [general] Timecodes of the form
MM:SS[.nnn]are now processed correctly #443 - [general] Updates to Windows distributions:
- The MoviePy backend is now included with Windows distributions
- Bundled Python interpreter is now Python 3.13
- Updated PyAV 10 -> 13.1.0 and OpenCV 4.10.0.82 -> 4.10.0.84
Python Distribution Changes
- v0.6.5.1 - Fix compatibility issues with PyAV 14+ #466
- v0.6.5.2 - Fix for
AttributeError: module 'cv2' has no attribute 'Mat'#468
New Contributors
PySceneDetect v0.6.4
Release Notes
Includes new histogram and perceptual hash based detectors (thanks @wjs018 and @ash2703), adds flash filter to content detector, and includes various bugfixes. Below shows the scores of the new detectors normalized against detect-content for comparison on a difficult segment with 3 cuts:
Feedback on the new detection methods and their default values is most welcome. Thanks to everyone who contributed for their help and support!
Changelog
- [feature] New detectors:
- [feature] Add flash suppression filter for
detect-content/ContentDetector(enabled by default) #35 #53- Reduces number of cuts generated during strobing or flashing effects
- Can be configured using
--filter-modeoption --filter-mode = merge(new default) merges consecutive scenes shorter thanmin-scene-len--filter-mode = suppress(previous default) disables generating new scenes untilmin-scene-lenhas passed
- [feature] Add more templates for
save-imagesfilename customization:$TIMECODE,$FRAME_NUMBER,$TIMESTAMP_MS(thanks @Veldhoen0) #395 - [bugfix] Remove extraneous console output when using
--drop-short-scenes - [bugfix] Fix scene lengths being smaller than
min-scene-lenwhen usingdetect-adaptive/AdaptiveDetectorwith large values of--frame-window - [bugfix] Fix crash when decoded frames have incorrect resolution and log error instead #319
- [bugfix] Update default ffmpeg stream mapping from
-map 0to-map 0:v:0 -map 0:a? -map 0:s?#392
PySceneDetect v0.6.3
Release Notes
In addition to some perfromance improvements with the load-scenes command, this release of PySceneDetect includes a significant amount of bugfixes. Thanks to everyone who contributed to the release, including those who filed bug reports and helped with debugging!
Program Changes:
- [bugfix] Fix crash for some WebM videos when using
save-imageswith--backend pyav#355 - [bugfix] Correct
--durationand--endfor presentation time when specified as frame numbers #341 - [bugfix] Progress bar now has correct frame accounting when
--durationor--endare set #341 - [bugfix] Only allow
load-scenesto be specified once, and disallow with otherdetect-*commands #347 - [bugfix] Disallow
-s/--startbeing larger than-e/--endfor thetimecommand - [bugfix] Fix
detect-adaptivenot respecting--min-scene-lenfor the first scene - [general] Comma-separated timecode list is now only printed when the
list-scenescommand is specified #356 - [general] Several changes to
[list-scenes]config file options:- Add
display-scenesanddisplay-cutsoptions to control output - Add
cut-formatto control formatting of cut points #349- Valid values:
frames,timecode,seconds
- Valid values:
- Add
- [general] Increase progress bar indent to improve visibility and visual alignment
- [improvement] The
ssuffix for setting timecode values in seconds is no longer required (values without decimal places are still interpreted as frame numbers) - [improvement]
load-scenesnow skips detection, generating output much faster #347 (thanks @wjs018 for the initial implementation)
API Changes:
- [bugfix] Fix
AttributeErrorthrown when accessingaspect_ratioon certain videos usingVideoStreamAv#355 - [bugfix] Fix circular imports due to partially initialized module for some development environments #350
- [bugfix] Fix
SceneManager.detect_sceneswarning whendurationorend_timeare specified as timecode strings #346 - [bugfix] Ensure correct string conversion behavior for
FrameTimecodewhen rounding is enabled #354 - [bugfix] Fix
AdaptiveDetectornot respectingmin_scene_lenfor the first scene - [feature] Add
output_dirargument tosplit_video_ffmpegandsplit_video_mkvmergefunctions to set output directory #298 - [feature] Add
formatterargument tosplit_video_ffmpegto allow formatting filenames via callback [#359](https://github.com/
/issues/359) - [general] The
frame_imgargument toSceneDetector.process_frame()is now required - [general] Remove
TimecodeValuefromscenedetect.frame_timecode(usetyping.Union[int, float, str]) - [general] Remove
MotionDetectorandscenedetect.detectors.motion_detectormodule (will be reintroduced afterSceneDetectorinterface is stable) - [improvement]
scenedetect.stats_managermodule improvements:- The
StatsManager.register_metrics()method no longer throws any exceptions - Add
StatsManager.metric_keysproperty to query registered metric keys - Deprecate
FrameMetricRegisteredandFrameMetricNotRegisteredexceptions (no longer used)
- The
- [improvement] When converting strings representing seconds to
FrameTimecode, thessuffix is now optional, and whitespace is ignored (note that values without decimal places are still interpreted as frame numbers) - [improvement] The
VideoCaptureAdapterinscenedetect.backends.opencvnow attempts to report duration if known
PySceneDetect v0.6.2
Release Notes
Includes new load-scenes command, ability to specify a default detector, PyAV 10 support, and several bugfixes. Minimum supported Python version is now Python 3.7.
Command-Line Changes:
- [feature] Add
load-scenescommand to load cuts fromlist-scenesCSV output #235 - [feature] Use
detect-adaptiveby default if a detector is not specified #329- Default detector can be set by config file with the
default-detectoroption under[global]
- Default detector can be set by config file with the
- [bugfix] Fix
-d/--durationand-e/--endoptions oftimecommand consuming one extra frame #307 - [bugfix] Fix incorrect end timecode for final scene when last frame of video is a new scene #307
- [bugfix] Expand
$VIDEO_NAMEbefore creating output directory for-f/--filenameoption ofsplit-video, now allows absolute paths - [general] Rename
ThresholdDetector(detect-threshold) metricdelta_rgbmetric toaverage_rgb - [general]
-l/--logfilealways produces debug logs now - [general] Remove
-a/--allflag fromscenedetect versioncommand, now prints all information by default (can still callscenedetectfor version number alone) - [general] Add
-h/--helpoptions globally and for each command - [general] Remove
alloption fromscenedetect helpcommand (can now callscenedetect helpfor full reference)
General:
- [feature] Add ability to specify method (floor/ceiling) when creating
ThresholdDetector, allows fade to white detection #143 - [general] Minimum supported Python version is now Python 3.7
- [general] Add support for PyAV 10.0 #292
- [general] Use platformdirs package instead of appdirs #309
- [bugfix] Fix
end_timealways consuming one extra frame #307 - [bugfix] Fix incorrect end timecode for last scene when
start_in_sceneisTrueor the final scene contains a single frame #307 - [bugfix] Fix MoviePy read next frame #320
- [bugfix] Template replacement when generating output now allows lower-case letters to be used as separators in addition to other characters
- [api] Make some public functions/methods private (prefixed with
_):get_aspect_ratiofunction inscenedetect.backends.opencvmean_pixel_distanceandestimated_kernel_sizefunctions inscenedetect.detectors.content_detectorcompute_frame_averagefunction inscenedetect.detectors.threshold_detectorscenedetect.cliandscenedetect.thirdpartymodules
- [api] Remove
compute_downscale_factorinscenedetect.video_stream(usescenedetect.scene_manager.compute_downscale_factorinstead) - [dist] Updated dependencies in Windows distributions: ffmpeg 6.0, PyAV 10, OpenCV 4.8, removed mkvmerge
Project Updates
- Website and documentation is now hosted on Github Pages, documentation can be found at scenedetect.com/docs
- Windows and Linux builds are now done on Github Actions, add OSX builds as well
- Build matrix has been updated to support Python 3.7 through 3.11 for all operating systems for Python distributions
- Windows portable builds have been moved to Github Actions, signed builds/installer is still done on Appveyor
- Windows distributions no longer include mkvmerge (can still download for Windows here)
PySceneDetect v0.6.1
Release Notes
Adds edge detection capability for fast cuts, addresses outstanding bugs, and includes various enhancements.
Changelog
Command-Line Changes:
- [feature] Add
moviepybackend wrapping the MoviePy package, usesffmpegbinary on the system for video decoding - [feature] Edge detection can now be enabled with
detect-contentanddetect-adaptiveto improve accuracy in some cases, especially under lighting changes, see new-w/--weightsoption for more information- A good starting point is to place 100% weight on the change in a frame's hue, 50% on saturation change, 100% on luma (brightness) change, and 25% on change in edges, with a threshold of 32:
detect-adaptive -w 1.0 0.5 1.0 0.25 - Edge differences are typically larger than other components, so you may need to increase
-t/--thresholdhigher when increasing the edge weight (the last component) withdetect-content, for example:
detect-content -w 1.0 0.5 1.0 0.25 -t 32 - May be enabled by default in the future once it has been more thoroughly tested, further improvements for
detect-contentare being investigated as well (e.g. motion compensation, flash suppression) - Short-form of
detect-contentoption--frame-windowhas been changed from-wto-fto accomodate this change
- A good starting point is to place 100% weight on the change in a frame's hue, 50% on saturation change, 100% on luma (brightness) change, and 25% on change in edges, with a threshold of 32:
- [enhancement] Progress bar now displays number of detections while processing, no longer conflicts with log message output
- [enhancement] When using ffmpeg to split videos,
-map 0has been added to the default arguments so other audio tracks are also included when present (#271) - [enhancement] Add
-aflag toversioncommand to print more information about versions of dependencies/tools being used - [enhancement] The resizing method used used for frame downscaling or resizing can now be set using a config file, see
[global]optiondownscale-methodand[save-images]optionscale-method - [other] Linear interpolation is now used as the default downscaling method (previously was nearest neighbor) for improved edge detection accuracy
- [other] Add
-c/--min-content-valargument todetect-adaptive, deprecate-d/--min-delta-hsv
General:
- [general] Recommend
detect-adaptiveoverdetect-content - [feature] Add new experimental backend
VideoStreamMoviePyusing the MoviePy package - [feature] Add edge detection to
ContentDetectorandAdaptiveDetector(#35)- Add ability to specify content score weights of hue, saturation, luma, and edge differences between frames
- Default remains as
1.0, 1.0, 1.0, 0.0so there is no change in behavior - Kernel size used for improving edge overlap can also be customized
- [feature]
AdaptiveDetectorno longer requires aStatsManagerand can now be used withframe_skip(#283) - [bugfix] Fix
scenedetect.detect()throwingTypeErrorwhen specifyingstats_file_path - [bugfix] Fix off-by-one error in end event timecode when
end_timewas set (reported end time was always one extra frame) - [bugfix] Fix a named argument that was incorrect (#299)
- [enhancement] Add optional
start_time,end_time, andstart_in_scenearguments toscenedetect.detect()(#282) - [enhancement] Add
-map 0option to default arguments ofsplit_video_ffmpegto include all audio tracks by default (#271) - [docs] Add example for using a callback (#273)
- [enhancement] Add new
VideoCaptureAdapterto make existingcv2.VideoCaptureobjects compatible with aSceneManager(#276)- Primary use case is for handling input devices/webcams and gstreamer pipes, see updated examples
- Files, image sequences, and network streams/URLs should continue to use
VideoStreamCv2
- [api] The
SceneManagermethodsget_cut_list()andget_event_list()are deprecated, along with thebase_timecodeargument - [api] The
base_timecodeargument ofget_scenes_from_cuts()inscenedetect.stats_manageris deprecated (the signature of this function has been changed accordingly) - [api] Rename
AdaptiveDetectorconstructor parametermin_delta_hsvto `min_content_val - [general] The default
crfforsplit_video_ffmpeghas been changed from 21 to 22 to match command line default - [enhancement] Add
interpolationproperty toSceneManagerto allow setting method of frame downscaling, use linear interpolation by default (previously nearest neighbor) - [enhancement] Add
interpolationargument tosave_imagesto allow setting image resize method (default remains bicubic)
