Releases: Breakthrough/PySceneDetect
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-mode
option --filter-mode = merge
(new default) merges consecutive scenes shorter thanmin-scene-len
--filter-mode = suppress
(previous default) disables generating new scenes untilmin-scene-len
has passed
- [feature] Add more templates for
save-images
filename 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-len
when usingdetect-adaptive
/AdaptiveDetector
with 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 0
to-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-images
with--backend pyav
#355 - [bugfix] Correct
--duration
and--end
for presentation time when specified as frame numbers #341 - [bugfix] Progress bar now has correct frame accounting when
--duration
or--end
are set #341 - [bugfix] Only allow
load-scenes
to be specified once, and disallow with otherdetect-*
commands #347 - [bugfix] Disallow
-s
/--start
being larger than-e
/--end
for thetime
command - [bugfix] Fix
detect-adaptive
not respecting--min-scene-len
for the first scene - [general] Comma-separated timecode list is now only printed when the
list-scenes
command is specified #356 - [general] Several changes to
[list-scenes]
config file options:- Add
display-scenes
anddisplay-cuts
options to control output - Add
cut-format
to 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
s
suffix for setting timecode values in seconds is no longer required (values without decimal places are still interpreted as frame numbers) - [improvement]
load-scenes
now skips detection, generating output much faster #347 (thanks @wjs018 for the initial implementation)
API Changes:
- [bugfix] Fix
AttributeError
thrown when accessingaspect_ratio
on certain videos usingVideoStreamAv
#355 - [bugfix] Fix circular imports due to partially initialized module for some development environments #350
- [bugfix] Fix
SceneManager.detect_scenes
warning whenduration
orend_time
are specified as timecode strings #346 - [bugfix] Ensure correct string conversion behavior for
FrameTimecode
when rounding is enabled #354 - [bugfix] Fix
AdaptiveDetector
not respectingmin_scene_len
for the first scene - [feature] Add
output_dir
argument tosplit_video_ffmpeg
andsplit_video_mkvmerge
functions to set output directory #298 - [feature] Add
formatter
argument tosplit_video_ffmpeg
to allow formatting filenames via callback [#359](https://github.com/
/issues/359) - [general] The
frame_img
argument toSceneDetector.process_frame()
is now required - [general] Remove
TimecodeValue
fromscenedetect.frame_timecode
(usetyping.Union[int, float, str]
) - [general] Remove
MotionDetector
andscenedetect.detectors.motion_detector
module (will be reintroduced afterSceneDetector
interface is stable) - [improvement]
scenedetect.stats_manager
module improvements:- The
StatsManager.register_metrics()
method no longer throws any exceptions - Add
StatsManager.metric_keys
property to query registered metric keys - Deprecate
FrameMetricRegistered
andFrameMetricNotRegistered
exceptions (no longer used)
- The
- [improvement] When converting strings representing seconds to
FrameTimecode
, thes
suffix is now optional, and whitespace is ignored (note that values without decimal places are still interpreted as frame numbers) - [improvement] The
VideoCaptureAdapter
inscenedetect.backends.opencv
now 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-scenes
command to load cuts fromlist-scenes
CSV output #235 - [feature] Use
detect-adaptive
by default if a detector is not specified #329- Default detector can be set by config file with the
default-detector
option under[global]
- Default detector can be set by config file with the
- [bugfix] Fix
-d
/--duration
and-e
/--end
options oftime
command 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_NAME
before creating output directory for-f
/--filename
option ofsplit-video
, now allows absolute paths - [general] Rename
ThresholdDetector
(detect-threshold
) metricdelta_rgb
metric toaverage_rgb
- [general]
-l
/--logfile
always produces debug logs now - [general] Remove
-a
/--all
flag fromscenedetect version
command, now prints all information by default (can still callscenedetect
for version number alone) - [general] Add
-h
/--help
options globally and for each command - [general] Remove
all
option fromscenedetect help
command (can now callscenedetect help
for 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_time
always consuming one extra frame #307 - [bugfix] Fix incorrect end timecode for last scene when
start_in_scene
isTrue
or 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_ratio
function inscenedetect.backends.opencv
mean_pixel_distance
andestimated_kernel_size
functions inscenedetect.detectors.content_detector
compute_frame_average
function inscenedetect.detectors.threshold_detector
scenedetect.cli
andscenedetect.thirdparty
modules
- [api] Remove
compute_downscale_factor
inscenedetect.video_stream
(usescenedetect.scene_manager.compute_downscale_factor
instead) - [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
moviepy
backend wrapping the MoviePy package, usesffmpeg
binary on the system for video decoding - [feature] Edge detection can now be enabled with
detect-content
anddetect-adaptive
to improve accuracy in some cases, especially under lighting changes, see new-w
/--weights
option 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
/--threshold
higher 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-content
are being investigated as well (e.g. motion compensation, flash suppression) - Short-form of
detect-content
option--frame-window
has been changed from-w
to-f
to 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 0
has been added to the default arguments so other audio tracks are also included when present (#271) - [enhancement] Add
-a
flag toversion
command 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-method
and[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-val
argument todetect-adaptive
, deprecate-d
/--min-delta-hsv
General:
- [general] Recommend
detect-adaptive
overdetect-content
- [feature] Add new experimental backend
VideoStreamMoviePy
using the MoviePy package - [feature] Add edge detection to
ContentDetector
andAdaptiveDetector
(#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.0
so there is no change in behavior - Kernel size used for improving edge overlap can also be customized
- [feature]
AdaptiveDetector
no longer requires aStatsManager
and can now be used withframe_skip
(#283) - [bugfix] Fix
scenedetect.detect()
throwingTypeError
when specifyingstats_file_path
- [bugfix] Fix off-by-one error in end event timecode when
end_time
was 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_scene
arguments toscenedetect.detect()
(#282) - [enhancement] Add
-map 0
option to default arguments ofsplit_video_ffmpeg
to include all audio tracks by default (#271) - [docs] Add example for using a callback (#273)
- [enhancement] Add new
VideoCaptureAdapter
to make existingcv2.VideoCapture
objects 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
SceneManager
methodsget_cut_list()
andget_event_list()
are deprecated, along with thebase_timecode
argument - [api] The
base_timecode
argument ofget_scenes_from_cuts()
inscenedetect.stats_manager
is deprecated (the signature of this function has been changed accordingly) - [api] Rename
AdaptiveDetector
constructor parametermin_delta_hsv
to `min_content_val - [general] The default
crf
forsplit_video_ffmpeg
has been changed from 21 to 22 to match command line default - [enhancement] Add
interpolation
property toSceneManager
to allow setting method of frame downscaling, use linear interpolation by default (previously nearest neighbor) - [enhancement] Add
interpolation
argument tosave_images
to 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.cfg
file 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-scene
option to merge last scene if shorter than--min-scene-len
- Add
-b
/--backend
option to use a specific video decoding backend- Supported backends are
opencv
andpyav
- Run
scenedetect help
to see a list of backends available on the current system - Both backends are included with Windows builds
- Supported backends are
split-video
command:detect-adaptive
command:--drop-short-scenes
now works properly withdetect-adaptive
detect-content
command:- Default threshold
-t
/--threshold
lowered to 27 to be more sensitive to shot changes (#246) - Add override for global
-m
/--min-scene-len
option
- Default threshold
detect-threshold
command:- Remove
-p
/--min-percent
and-b
/--block-size
options - Add override for global
-m
/--min-scene-len
option
- Remove
save-images
command now works when-i
/--input
is an image sequences- Default backend (OpenCV) is more robust to video decoder failures
-i
/--input
may no longer be specified multiple times, if required use an external tool (e.g.ffmpeg
,mkvmerge
) to perform concatenation before processing-s
/--stats
no longer loads existing statistics and will overwrite any existing files-l
/--logfile
now respects-o
/--output
-v
/--verbosity
now 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
scale
orheight
/width
arguments to resize images
- Use
- New
VideoStream
replacesVideoManager
(#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_number
is 1-based whereasposition
is 0-based to align with PTS) - See
test_time_invariants
intests/test_video_stream.py
as 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 systemsSceneManager
is now responsible for frame downscaling via thedownscale
/auto_downscale
propertiesdetect_scenes()
no longer shows a progress bar by default, setshow_progress=True
to 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=True
for previous behavior (one scene spanning the entire input)
- Changes to
StatsManager
:save_to_csv()
now accepts a path or an open file handlebase_timecode
argument 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 FrameTimecode
objects can now perform arithmetic with formatted strings, e.g.'HH:MM:SS.nnn'
- Merged constants
MAX_FPS_DELTA
andMINIMUM_FRAMES_PER_SECOND_DELTA_FLOAT
inscenedetect.frame_timecode
into newMAX_FPS_DELTA
constant video_manager
parameter has been removed from theAdaptiveDetector
constructorsplit_video_ffmpeg
andsplit_video_mkvmerge
function arguments have been renamed and defaults updated:suppress_output
is nowshow_output
, default isFalse
hide_progress
is nowshow_progress
, default isFalse
block_size
argument has been removed from theThresholdDetector
constructorcalculate_frame_score
method ofContentDetector
has been renamed to_calculate_frame_score
, use new module-level function of the same name insteadget_aspect_ratio
has been removed fromscenedetect.platform
(use theaspect_ratio
property of aVideoStream
instead)- 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
av
to run thescenedetect
command
Known Issues
- URL inputs are not supported by the
save-images
orsplit-video
commands - Variable framerate videos (VFR) are not fully supported, and will yield incorrect timestamps (#168)
- The
detect-threshold
option-l
/--add-last-scene
cannot 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
PySceneDetect v0.6-rc0
PySceneDetect v0.6-dev3
PySceneDetect v0.6-dev2
PySceneDetect v0.5.6.1
Fixes crash when using detect-content or detect-adaptive with latest version of OpenCV (thanks @bilde2910). Does not affect the Windows distributions, for the installer/portable version continue to download v0.5.6.
PySceneDetect v0.5.6
Release Notes
- New detection algorithm:
detect-adaptive
which works similar todetect-content
, but with reduced false negatives during fast camera movement (thanks @scarwire and @wjs018) - Images generated by
save-images
can now be resized via the command line - Statsfiles now work properly with
detect-threshold
- Removed the
-p
/--min-percent
option fromdetect-threshold
- Add new option
-l
/--luma-only
todetect-content
/detect-adaptive
to only consider brightness channel (useful for greyscale videos)
Changelog
- [feature] New adaptive content detector algorithm
detect-adaptive
(#153, thanks @scarwire and @wjs018) - [feature] Images generated with the
save-images
command (scene_manager.save_images()
function in the Python API) can now be scaled or resized (#160 and PR #203, thanks @wjs018)- Images can be resized by a constant scaling factory using
-s
/--scale
(e.g.--scale 0.5
shrinks the height/width by half) - Images can be resized to a specified height (
-h
/--height
) and/or width (-w
/--width
), in pixels; if only one is specified, the aspect ratio of the original video is kept
- Images can be resized by a constant scaling factory using
- [api] Calling
seek()
on aVideoManager
will now respect the end time if set - [api] The
split_video_
functions now return the exit code of invokingffmpeg
ormkvmerge
(#209, thanks @AdrienLF) - [api] Removed the
min_percent
argument fromThresholdDetector
as was not providing any performance benefit for the majority of use cases (#178) - [bugfix] The
detect-threshold
command now works properly with a statsfile (#211, thanks @jeremymeyers) - [bugfix] Fixed crash due to unhandled
TypeError
exception when using non-PyPI OpenCV packages from certain Linux distributions (#220) - [bugfix] A warning is now displayed for videos which may not be decoded correctly, esp. VP9 (#86, thanks @wjs018)
- [api] A named logger is now used for both API and CLI logging instead of the root logger (#205)
Known Issues
- Variable framerate videos (VFR) are not fully supported, and will yield incorrect timestamps (#168)
- The
-l
/--add-last-scene
option indetect-threshold
cannot be disabled - Image sequences or URL inputs are not supported by the
save-images
orsplit-video
commands (in v0.6save-images
works with image sequences) - Due to the use of truncation for frame number calculation, FrameTimecode objects may be off-by-one when constructed using a float value (#268, fixed in v0.6)