Releases: Breakthrough/PySceneDetect
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)
PySceneDetect v0.6
Release Notes
PySceneDetect v0.6 is a major breaking change including better performance, configuration file support, and a more ergonomic API. The new minimum Python version is now 3.6. See the Migration Guide for information on how to port existing applications to the new API. Most users will see performance improvements after updating, and changes to the command-line are not expected to break most workflows.
The main goals of v0.6 are reliability and performance. To achieve this required several breaking changes. The video input API was refactored, and many technical debt items were addressed. This should help the eventual transition to the first planned stable release (v1.0) where the goal is an improved scene detection API.
Both the Windows installer and portable distributions now include signed executables. Many thanks to SignPath, AppVeyor, and AdvancedInstaller for their support.
Changelog
Overview:
- Major performance improvements on multicore systems
- Configuration file support via command line option or user settings folder
- Support for multiple video backends, PyAV is now supported in addition to OpenCV
- Breaking API changes to
VideoManager(replaced withVideoStream),StatsManager, andsave_images()- See the Migration Guide for details on how to update from v0.5.x
- A backwards compatibility layer has been added to prevent most applications from breaking, will be removed in a future release
- Support for Python 2.7 has been dropped, minimum supported Python version is 3.6
- Support for OpenCV 2.x has been dropped, minimum OpenCV version is 3.x
- Windows binaries are now signed, thanks SignPath.io (certificate by SignPath Foundation)
Command-Line Changes:
- Configuration files are now supported, see documentation for details
- Can specify config file path with
-c/--config, or create ascenedetect.cfgfile in your user config folder
- Can specify config file path with
- Frame numbers are now 1-based, aligning with most other tools (e.g.
ffmpeg) and video editors (#265) - Start/end frame numbers of adjacent scenes no longer overlap (#264)
- End/duration timecodes still include the frame's presentation time
- Add
--merge-last-sceneoption to merge last scene if shorter than--min-scene-len - Add
-b/--backendoption to use a specific video decoding backend- Supported backends are
opencvandpyav - Run
scenedetect helpto see a list of backends available on the current system - Both backends are included with Windows builds
- Supported backends are
split-videocommand:detect-adaptivecommand:--drop-short-scenesnow works properly withdetect-adaptive
detect-contentcommand:- Default threshold
-t/--thresholdlowered to 27 to be more sensitive to shot changes (#246) - Add override for global
-m/--min-scene-lenoption
- Default threshold
detect-thresholdcommand:- Remove
-p/--min-percentand-b/--block-sizeoptions - Add override for global
-m/--min-scene-lenoption
- Remove
save-imagescommand now works when-i/--inputis an image sequences- Default backend (OpenCV) is more robust to video decoder failures
-i/--inputmay no longer be specified multiple times, if required use an external tool (e.g.ffmpeg,mkvmerge) to perform concatenation before processing-s/--statsno longer loads existing statistics and will overwrite any existing files-l/--logfilenow respects-o/--output-v/--verbositynow takes precedence over-q/--quiet
API Changes:
- New
detect()function performs scene detection on a video path, see example here - New
open_video()function to handle video input, see example here split_video_ffmpeg()andsplit_video_mkvmerge()now take a single path as inputsave_images()no longer acceptsdownscale_factor- Use
scaleorheight/widtharguments to resize images
- Use
- New
VideoStreamreplacesVideoManager(#213)- Supports both OpenCV (
VideoStreamCv2) and PyAV (VideoStreamAv) - Improves video seeking invariants, especially around defining what frames 0 and 1 mean for different time properties (
frame_numberis 1-based whereaspositionis 0-based to align with PTS) - See
test_time_invariantsintests/test_video_stream.pyas a reference of specific behaviours
- Supports both OpenCV (
- Changes to
SceneManager:detect_scenes()now performs video decoding in a background thread, improving performance on most systemsSceneManageris now responsible for frame downscaling via thedownscale/auto_downscalepropertiesdetect_scenes()no longer shows a progress bar by default, setshow_progress=Trueto restore the previous behaviourclear()now clears detectors, as they may be statefulget_scene_list()now returns an empty list if there are no detected cuts, specifystart_in_scene=Truefor previous behavior (one scene spanning the entire input)
- Changes to
StatsManager:save_to_csv()now accepts a path or an open file handlebase_timecodeargument has been removed fromsave_to_csv()load_from_csv()is now deprecated and will be removed in v1.0
- Changes to
FrameTimecode:- Use rounding instead of truncation when calculating frame numbers to fix incorrect round-trip conversions and improve accuracy (#268)
- Fix
previous_frame()generating negative frame numbers in some cases FrameTimecodeobjects can now perform arithmetic with formatted strings, e.g.'HH:MM:SS.nnn'
- Merged constants
MAX_FPS_DELTAandMINIMUM_FRAMES_PER_SECOND_DELTA_FLOATinscenedetect.frame_timecodeinto newMAX_FPS_DELTAconstant video_managerparameter has been removed from theAdaptiveDetectorconstructorsplit_video_ffmpegandsplit_video_mkvmergefunction arguments have been renamed and defaults updated:suppress_outputis nowshow_output, default isFalsehide_progressis nowshow_progress, default isFalse
block_sizeargument has been removed from theThresholdDetectorconstructorcalculate_frame_scoremethod ofContentDetectorhas been renamed to_calculate_frame_score, use new module-level function of the same name insteadget_aspect_ratiohas been removed fromscenedetect.platform(use theaspect_ratioproperty of aVideoStreaminstead)- Backwards compatibility with v0.5 to avoid breaking most applications on release while still allowing performance improvements
Python Distribution Changes
- v0.6.0.3 - Fix missing package description
- v0.6.0.2 - Improve error messaging when OpenCV is not installed
- v0.6.0.1 - Fix original v0.6 release requiring
avto run thescenedetectcommand
Known Issues
- URL inputs are not supported by the
save-imagesorsplit-videocommands - Variable framerate videos (VFR) are not fully supported, and will yield incorrect timestamps (#168)
- The
detect-thresholdoption-l/--add-last-scenecannot be disabled - Due to a switch from EXE to MSI for the Windows installer, you may have to uninstall older versions first before installing v0.6
