镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

Releases

PySceneDetect v0.7.3

Choose a tag to compare

@Breakthrough Breakthrough released this 08 Nov 22:44

PySceneDetect 0.7.3 adds scene-length based image export to save-images, a close() method and context manager support for VideoStream, and fixes several timing bugs: PyAV frame timing for videos without presentation timestamps, save-edl timecode drift at NTSC frame rates, OTIO source durations, and the last scene of variable framerate videos. Windows distributions ship updated dependencies.

CLI Changes

  • [feature] Add -i/--interval to save-images to save images based on the length of each scene: one image per DURATION, with --min-images/--max-images to limit the number of images per scene, e.g. save-images -i 2s --max-images 10 (interval/min-images/max-images in the config file, and interval/min_images/max_images in save_images()) #280
  • [cli] --help now prints [default: ...] and [setting: ...] values as they are written in a config file (merge, fcpx, yes/no instead of Mode.MERGE, FcpFormat.FCPX, True/on), the [backend-pyav] threading-mode config value is now validated, and the scenedetect.cfg template matches the real config keys and defaults (verbosity, downscale, default-detector, fade-bias, start-timecode, OTIO name, and removed stale filter-mode/luma-only entries) #589
  • [bugfix] $VIDEO_NAME is now derived from the path component of URL inputs, ignoring the query string and fragment (e.g. https://host/clip.mp4?token=1.2 -> clip). URLs with no path use the host. Previously the query string leaked into output filenames, which fails on Windows. #197
  • [bugfix] OTIO exports use the full source duration when provided, including from the CLI, instead of declaring a fixed 1,980-frame duration. The available range remains unspecified when the duration is unknown. Scene source ranges are unchanged. #580
  • [bugfix] The OpenCV backend keeps position on the last frame after reaching the end of a VFR video, so the last scene no longer ends early (or before it starts) #561
  • [bugfix] save-html --no-images now writes to the global -o/--output directory instead of the working directory #583
  • [bugfix] split-video with -o now logs the output folder instead of repeating the filename template #595
  • [bugfix] Allow -d/--downscale on the CLI and downscale in the config file to be set to 0 for automatic downscaling
  • [bugfix] save-edl timecodes now count frames at the nominal rate (24, 30, or 60 per timecode second for 23.976, 29.97, or 59.94 fps) as required for non-drop-frame timecode, instead of being derived from wall-clock seconds. Previously the EDL drifted by roughly 3.6 seconds per hour at these rates. --start-timecode is parsed the same way, so -s 01:00:00:00 now starts the first event at 01:00:00:00. Non-standard rates (e.g. the average rate of a VFR video) are unchanged. Thanks to @Cassian433 for the detailed report #593

API Changes

  • [feature] VideoStream has a new close() method to release the file handles and decoders a video holds, and can be used as a context manager (with open_video(path) as video:) to close it automatically. Calling close() more than once has no effect. Once an OpenCV, PyAV, MoviePy or concatenated stream is closed, read(), seek() and reset() raise ValueError, while properties describing the video (path, name, frame_rate, duration, frame_size, aspect_ratio) remain available. The default implementation does nothing, so existing VideoStream subclasses are unaffected, and VideoCaptureAdapter leaves the caller's VideoCapture open #568
  • [api] VideoStream.seek() now documents that the stream position is undefined after a SeekError is raised, and reset() must be called before reading further
  • [bugfix] VideoStreamConcat no longer keeps its input videos open when they can't be concatenated (e.g. mismatched resolutions), and now closes each input explicitly once it is no longer needed instead of relying on garbage collection #568
  • [bugfix] write_scene_list() now starts the cut list row with Timecode List: when no cut_list is passed, as it does when one is passed and as write_scene_list_html() does
  • [bugfix] Fix pyav backend timing for videos that lack presentation timestamps (e.g. AVI files, elementary H.264 streams), which could lead to frame positions being out of order or stuck at zero and shifting cuts by one or more frames (#590, PyAV#933, PyAV#2478)
    • Videos are now opened with FFmpeg's genpts flag disabled.
    • Each frame will use the exact presentation timestamp, but if it is unavailable we now fall back to the decode timestamp to be consistent with the opencv backend.
    • A frame with neither timestamp is placed one frame period after the previous frame (as the moviepy backend does for every frame).
    • A one-time warning is emitted if timestamps are still detected going backwards.
    • VideoStreamAv.seek() now raises SeekError on streams that cannot be seeked (e.g. elementary streams without timestamps) instead of a backend-specific exception.
    • VideoStreamAv.seek() now falls back to reading from the start when the demuxer lands on a frame without a timestamp past the target, and seek(0) always re-opens the video, fixing wrong positions after seeking in some MPEG-TS files.

Packaging

  • [general] Updates to Windows distributions:
    • av 19.0.1 -> 19.0.2
    • click 8.5.0 -> 8.5.1
    • imageio-ffmpeg 0.6.0 -> 0.8.1
    • pillow 12.3.0 -> 13.0.0
    • platformdirs 4.13.0 -> 4.14.5

Downloads

  • Windows: PySceneDetect-0.7.3-win64.msi (installer) or PySceneDetect-0.7.3-win64.zip (portable); both signed, checksums in SHA256SUMS and PySceneDetect-0.7.3-win64.manifest.json
  • Python: pip install scenedetect==0.7.3 (or scenedetect-headless); wheels and sdists attached
  • Full changelog: https://www.scenedetect.com/changelog/

Thanks to @nikhiljangid120, @sungbin1015, @qwist1233-cpu, @vishal-tambi, @Rober1208, @ChandraChaan and @MuhammadBilalKhan267 for their contributions to this release.

PySceneDetect v0.7.2

Choose a tag to compare

@Breakthrough Breakthrough released this 12 Oct 04:44
7cd1005

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) default threshold changed from 0.05 to 0.20 and default bins from 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 256 or HistogramDetector(threshold=0.05, bins=256) to restore the previous behavior.
  • [improvement] HashDetector (detect-hash) default threshold changed from 0.395 to 0.35 and default size from 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 16 or HashDetector(threshold=0.395, size=16) to restore the previous behavior.
  • [improvement] detect-threshold now ignores fade-outs shorter than 0.1s by default. Use --min-out-length 0 to restore the previous behavior. The API default remains 0 #278
  • [feature] Added save-keyframes command to export detected cuts using # keyframe format v1 for Aegisub-compatible tools #534. Frame numbers are currently approximate for VFR input #569
  • [feature] Add --min-out-length/min_out_length to detect-threshold/ThresholdDetector, which requires that fades stay below the threshold for the given duration #278
  • [general] -f, --frame-rate, and --framerate are 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-adaptive emitting scenes shorter than min_scene_len when window_width is large, by applying the minimum-length check to the emitted (target) frame instead of the current frame #408

API Changes

  • [api] Legacy framerate argument aliases in FrameTimecode, open_video(), and the video backends now emit a DeprecationWarning; use frame_rate instead. When both forms are provided, frame_rate takes precedence #548
  • [api] write_scene_list() now also accepts a path (str or pathlib.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-threshold with method CEILING now classifies the first frame with the CEILING rule instead of the FLOOR rule, which anchored a leading fade one frame late and could emit a spurious cut at the first frame (thanks @MuhammadBilalKhan267)
  • [bugfix] Fix min_scene_len given in frames dropping cuts that are exactly min_scene_len frames apart at NTSC framerates (e.g. 29.97 fps), by comparing frame counts instead of converting to seconds #577
  • [bugfix] Fix TypeError when opening videos with the pyav backend on PyAV 19.0 or newer (PyAV 19 is now supported)
  • [bugfix] Fix pyav backend duration calculation fallback
  • [bugfix] Fix pyav backend not releasing the file handle it opened when the stream is garbage collected, which emitted a ResourceWarning under python -X dev #568
  • [bugfix] Work around an intermittent segfault on exit with the OpenCV backend on Windows when opening PNG image sequences with opencv-python 4.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-core package introduced in 0.7.1 has been discontinued, and its only release (0.7.1) yanked from PyPI. Existing scenedetect-core installs keep working but will not receive updates. Install either scenedetect or scenedetect-headless. #558

PySceneDetect v0.7.1

Choose a tag to compare

@Breakthrough Breakthrough released this 22 Jul 02:49

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-video has a new --expand flag: 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 a backend keyword argument ("opencv", "pyav", or "moviepy") similar to open_video. Defaults to "opencv", matching prior behavior.
  • [feature] Add expand_scenes_to_bounds() helper in scenedetect.scene_manager to 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] VideoStream now provides a public read-only decode_failures property 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() and detect() 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 during read() 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 position 0, consistent with other backends and with seek()
  • [bugfix] Comparisons between two FrameTimecode objects that both carry exact presentation times (e.g. positions from VFR videos) and share the same frame rate are now performed exactly using pts and time_base instead 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] scenedetect and scenedetect-headless are unchanged: they continue to ship the full program (library + CLI) with opencv-python / opencv-python-headless respectively. Both packages provide the same scenedetect module (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

Choose a tag to compare

@Breakthrough Breakthrough released this 03 May 22:56

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-fcp command allows exporting in Final Cut Pro format (FCP7/FCPX) #156
  • [feature] New save-qp command writes a QP file with scene boundary frame numbers, suitable for forcing keyframes at scene cuts in x264/x265 #448
  • [feature] New save-html command replaces the deprecated export-html; the prior command remains as an alias and emits a deprecation warning #518
  • [feature] Add save-edl option --start-timecode/-s to providde a custom start timecode for generated EDLs, supports SMPTE HH:MM:SS:FF or 8-digit HHMMSSFF input #515
  • [bugfix] Fix floating-point precision error in save-otio output where frame values near integer boundaries (e.g. 90.00000000000001) were serialized with spurious precision
  • [bugfix] Add mitigation for transient OSError in 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 the VideoStreamMoviePy(frame_rate=...) API), bringing it in line with the OpenCV and PyAV backends
  • [bugfix] detect-threshold cut 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 .5 rounding boundary (PyAV uses sub-microsecond PTS, OpenCV uses millisecond-truncated CAP_PROP_POS_MSEC)
  • [breaking] Remove deprecated -d/--min-delta-hsv option from detect-adaptive command (use -c/--min-content-val instead)
  • [breaking] Rename -f/--framerate to -f/--frame-rate as part of VFR overhaul (legacy --framerate form is preserved as a hidden alias but will be removed in v0.8)
  • [general] Support SCENEDETECT_DEBUG environment variable to control how exceptions and debugging are handled. Unhandled exceptions and Ctrl+C now produce a logger-formatted error message and exit cleanly with code 1 instead of dumping a raw Python traceback. Set SCENEDETECT_DEBUG=1 to 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, and write_scene_list_otio to the scenedetect.output module so save-edl, save-fcp, and save-otio can be invoked directly from Python (previously CLI-only)
  • write_scene_list_edl accepts an optional start_timecode parameter (SMPTE HH:MM:SS:FF or 8-digit HHMMSSFF) that is added to every event's source and record columns #515
  • Add new Timecode type to represent frame timings in terms of the video's source timebase
  • Add time_base and pts properties to FrameTimecode for more accurate timing information
  • All backends (PyAV, OpenCV, MoviePy) now return PTS-backed timestamps from VideoStream.position
  • VideoStream.frame_rate now returns Fraction instead of float
  • Framerates are now stored as rational Fraction values (e.g. Fraction(24000, 1001) instead of 23.976) to avoid float precision loss
  • Common NTSC rates (23.976, 29.97, 59.94) are automatically detected from float values
  • FrameTimecode.frame_num is now approximate for VFR video (based on PTS-derived time)
  • Add frame_rate property (returns exact Fraction) as the canonical replacement for framerate (returns float) in FrameTimecode and VideoStream
    • For CFR sources, both properties represent the same rate, i.e. time_base equals 1 / frame_rate for CFR sources #548
  • Add frame_rate keyword argument to open_video() and the VideoStreamCv2, VideoCaptureAdapter, VideoStreamAv, and VideoStreamMoviePy constructors as the canonical replacement for framerate #548; accepts float | Fraction | None. The legacy framerate keyword is retained as a deprecated alias and is ignored when frame_rate is provided
  • Add equal_frame_rate(other) method as the canonical replacement for equal_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-python a requirement, add separate scenedetect-headless variant instead

Detector Interface:

  • Replace frame_num parameter (int) with timecode (FrameTimecode) in SceneDetector interface #168:
    • The detector interface: SceneDetector.process_frame() and SceneDetector.post_process() (the post_process signature on the abstract base is now consistently typed as FrameTimecode to match its concrete-detector overrides; the prior int annotation did not reflect the actual runtime value)
    • Statistics: StatsManager.get_metrics(), StatsManager.set_metrics(), and StatsManager.metrics_exist() formally accept either FrameTimecode or int (the int form is retained for compatibility with the deprecated load_from_csv() path, which keys metrics by integer frame number)
  • StatsManager.load_from_csv() and save_images() output_dir now accept os.PathLike (e.g. pathlib.Path) in addition to str
  • SceneManager.detect_scenes() duration and end_time formally accept int (frames), float (seconds), str (timecode), or FrameTimecode - matching the documented and runtime-supported behavior
  • SceneDetector is now a Python abstract class
  • SceneDetector instances can now assume they always have frame data to process when process_frame is called
  • Remove SceneDetector.is_processing_required() method
  • Remove SceneDetector.stats_manager_required property, no longer required
  • Remove deprecated SparseSceneDetector interface
  • Detector min_scene_len and save_images() frame_margin arguments 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_detector moved to scenedetect.detector
  • scenedetect.frame_timecode moved to scenedetect.common
  • Image/HTML/CSV export in scenedetect.scene_manager moved to scenedetect.output #463
  • scenedetect.video_splitter moved to scenedetect.output.video #463

FrameTimecode:

  • Add properties to access frame_num, frame_rate, and seconds instead of getter methods
  • frame_num and frame_rate are now read-only properties (construct a new FrameTimecode to change them)
  • Remove FrameTimecode.previous_frame() method
  • Deprecated functionality preserved from v0.6 now uses the warnings module to emit runtime deprecation warnings, these features will be removed in v0.8
  • Soft-deprecate framerate property and equal_framerate() method via docstring; the legacy forms will continue to work until v0.8 when they will be upgraded to DeprecationWarning before removal in v0.9

Removals:

  • Remove deprecated module scenedetect.video_manager, use the scenedetect.open_video() function instead
  • Remove deprecated parameters base_timecode and video_manager from various functions
  • Remove deprecated SceneManager.get_event_list() method
  • Remove deprecated AdaptiveDetector.get_content_val() method (use StatsManager instead)
  • Remove deprecated AdaptiveDetector constructor arg min_delta_hsv (use min_content_val instead)
  • Remove advance parameter from VideoStream.read()
  • Remove SceneDetector.stats_manager_required property, no longer required
  • SceneDetector is 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...
Read more

PySceneDetect v0.6.7

Choose a tag to compare

@Breakthrough Breakthrough released this 25 Aug 03:37

Release Notes

Fixes issues with importing EDL files into DaVinci Resolve and other editors, update ffmpeg.

Changelog

  • [bugfix] Fix save-edl end 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

Choose a tag to compare

@Breakthrough Breakthrough released this 10 Mar 01:43

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-otio command supports saving scenes in OTIO format #497
  • [feature] New save-edl command 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-video with -m/--mkvmerge option #473
  • [bugfix] Fix incorrect default filename template for split-video command with -m/--mkvmerge option
  • [bugfix] Fix inconsistent filenames when using split_video_mkvmerge()
  • [bugfix] Ensure auto-rotation is always enabled for VideoStreamCv2 as workaround for opencv#26795
  • [general] The export-html command is now deprecated, use save-html instead
  • [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

  • @awkrail made their first contribution in #480 (and many more since!)

PySceneDetect v0.6.5

Choose a tag to compare

@Breakthrough Breakthrough released this 17 Dec 23:30

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 --crop option to scenedetect command and config file to crop video frames before scene detection
    • [api] Add crop property to SceneManager to crop video frames before scene detection
  • [feature] Add ability to configure CSV separators for rows/columns in config file #423
  • [feature] Add new --show flag to export-html command to launch browser after processing #442
  • [improvement] Add new threading option to save-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-html command now implicitly invokes save-images with default parameters
    • The output of the export-html command will always use the result of the save-images command that precedes it
  • [improvement] save_to_csv now works with paths from pathlib
  • [api] The save_to_csv function now works correctly with paths from the pathlib module
  • [api] Add col_separator and row_separator args to write_scene_list function in scenedetect.scene_manager
  • [api] The MoviePy backend now works with MoviePy 2.0+
  • [bugfix] Fix SyntaxWarning due to incorrect escaping #400
  • [bugfix] Fix ContentDetector crash 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-detector config 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

Choose a tag to compare

@Breakthrough Breakthrough released this 11 Jun 03:48

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:

comparison of new detector scores

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:
    • detect-hist / HistogramDetector #295 #53
    • detect-hash / HashDetector #290
  • [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 than min-scene-len
    • --filter-mode = suppress (previous default) disables generating new scenes until min-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 using detect-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

Choose a tag to compare

@Breakthrough Breakthrough released this 10 Mar 03:11

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 other detect-* commands #347
  • [bugfix] Disallow -s/--start being larger than -e/--end for the time 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 and display-cuts options to control output
    • Add cut-format to control formatting of cut points #349
      • Valid values: frames, timecode, seconds
  • [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 accessing aspect_ratio on certain videos using VideoStreamAv #355
  • [bugfix] Fix circular imports due to partially initialized module for some development environments #350
  • [bugfix] Fix SceneManager.detect_scenes warning when duration or end_time are specified as timecode strings #346
  • [bugfix] Ensure correct string conversion behavior for FrameTimecode when rounding is enabled #354
  • [bugfix] Fix AdaptiveDetector not respecting min_scene_len for the first scene
  • [feature] Add output_dir argument to split_video_ffmpeg and split_video_mkvmerge functions to set output directory #298
  • [feature] Add formatter argument to split_video_ffmpeg to allow formatting filenames via callback [#359](https://github.com/
    /issues/359)
  • [general] The frame_img argument to SceneDetector.process_frame() is now required
  • [general] Remove TimecodeValue from scenedetect.frame_timecode (use typing.Union[int, float, str])
  • [general] Remove MotionDetector and scenedetect.detectors.motion_detector module (will be reintroduced after SceneDetector 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 and FrameMetricNotRegistered exceptions (no longer used)
  • [improvement] When converting strings representing seconds to FrameTimecode, the s suffix is now optional, and whitespace is ignored (note that values without decimal places are still interpreted as frame numbers)
  • [improvement] The VideoCaptureAdapter in scenedetect.backends.opencv now attempts to report duration if known

PySceneDetect v0.6.2

Choose a tag to compare

@Breakthrough Breakthrough released this 23 Jul 21:57

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 from list-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]
  • [bugfix] Fix -d/--duration and -e/--end options of time 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 of split-video, now allows absolute paths
  • [general] Rename ThresholdDetector (detect-threshold) metric delta_rgb metric to average_rgb
  • [general] -l/--logfile always produces debug logs now
  • [general] Remove -a/--all flag from scenedetect version command, now prints all information by default (can still call scenedetect for version number alone)
  • [general] Add -h/--help options globally and for each command
  • [general] Remove all option from scenedetect help command (can now call scenedetect 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 is True 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 in scenedetect.backends.opencv
    • mean_pixel_distance and estimated_kernel_size functions in scenedetect.detectors.content_detector
    • compute_frame_average function in scenedetect.detectors.threshold_detector
    • scenedetect.cli and scenedetect.thirdparty modules
  • [api] Remove compute_downscale_factor in scenedetect.video_stream (use scenedetect.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)