scenedetect 🎬 Package¶
The scenedetect API is easy to integrate with most application workflows, while also being highly extensible. See the Getting Started section below for some common use cases and integrations. The scenedetect package contains several modules:
scenedetect 🎬: Includes the
scenedetect.detectfunction which takes a path and a detector to find scene transitions (example), andscenedetect.open_videofor video inputscenedetect.scene_manager 🎞️: The
SceneManageracts as a way to coordinate detecting scenes (via SceneDetector instances) on video frames (via VideoStream instances). This module also contains functionality to export information about scenes in various formats:save_imagesto save images for each scene,write_scene_listto save scene/cut info as CSV, andwrite_scene_list_htmlto export scenes in viewable HTML format.scenedetect.detectors 🕵️: Detection algorithms:
ContentDetector: detects fast cuts using weighted average of HSV changes
ThresholdDetector: finds fades in/out using average pixel intensity changes in RGB
AdaptiveDetectorfinds fast cuts using rolling average of HSL changes
HistogramDetectorfinds fast cuts using HSV histogram changes
HashDetector: finds fast cuts using perceptual image hashingscenedetect.video_stream 🎥: Video input is handled through the
VideoStreaminterface. Implementations for common video libraries are provided inscenedetect.backends:
OpenCV:
VideoStreamCv2PyAV:
VideoStreamAvMoviePy:
VideoStreamMoviePyscenedetect.video_splitter ✂️: Contains
split_video_ffmpegandsplit_video_mkvmergeto split a video based on the detected scenes.scenedetect.frame_timecode ⏱️: Contains
FrameTimecodeclass for storing, converting, and performing arithmetic on timecodes with frame-accurate precision.scenedetect.scene_detector 🌐: Contains
SceneDetectorinterface which detection algorithms must implement.scenedetect.stats_manager 🧮: Contains
StatsManagerclass for caching frame metrics and loading/saving them to disk in CSV format for analysis.scenedetect.platform 🐱💻: Logging and utility functions.
Most types/functions are also available directly from the scenedetect package to make imports simpler.
Warning
The PySceneDetect API is still under development. It is recommended that you pin the scenedetect version in your requirements to below the next major release:
scenedetect<0.7
Getting Started¶
PySceneDetect makes it very easy to find scene transitions in a video with the scenedetect.detect() function:
from scenedetect import detect, ContentDetector
path = "video.mp4"
scenes = detect(path, ContentDetector())
for (scene_start, scene_end) in scenes:
print(f'{scene_start}-{scene_end}')
scenes now contains a list of FrameTimecode pairs representing the start/end of each scene. Note that you can set show_progress=True when calling detect to display a progress bar with estimated time remaining.
Here, we use ContentDetector to detect fast cuts. There are many detector types which can be used to find fast cuts and fades in/out. PySceneDetect can also export scene data in various formats, and can split the input video automatically if ffmpeg is available:
from scenedetect import detect, ContentDetector, split_video_ffmpeg
scene_list = detect("my_video.mp4", ContentDetector())
split_video_ffmpeg("my_video.mp4", scenes)
Recipes for common use cases can be found on Github including limiting detection time and storing per-frame metrics. For advanced workflows, start with the SceneManager usage examples.
Functions¶
The scenedetect module comes with helper functions to simplify common use cases.
detect() can be used to perform scene detection on a video by path. open_video()
can be used to open a video for a
SceneManager.
- scenedetect.detect(video_path, detector, stats_file_path=None, show_progress=False, start_time=None, end_time=None, start_in_scene=False)¶
Perform scene detection on a given video path using the specified detector.
- Parameters:
video_path (str) – Path to input video (absolute or relative to working directory).
detector (SceneDetector) – A SceneDetector instance (see
scenedetect.detectorsfor a full list of detectors).stats_file_path (str | None) – Path to save per-frame metrics to for statistical analysis or to determine a better threshold value.
show_progress (bool) – Show a progress bar with estimated time remaining. Default is False.
start_time (str | float | int | None) – Starting point in video, in the form of a timecode
HH:MM:SS[.nnn](str), number of seconds123.45(float), or number of frames200(int).end_time (str | float | int | None) – Starting point in video, in the form of a timecode
HH:MM:SS[.nnn](str), number of seconds123.45(float), or number of frames200(int).start_in_scene (bool) – Assume the video begins in a scene. This means that when detecting fast cuts with ContentDetector, if no cuts are found, the resulting scene list will contain a single scene spanning the entire video (instead of no scenes). When detecting fades with ThresholdDetector, the beginning portion of the video will always be included until the first fade-out event is detected.
- Returns:
List of scenes as pairs of (start, end)
FrameTimecodeobjects.- Raises:
VideoOpenFailure – video_path could not be opened.
StatsFileCorrupt – stats_file_path is an invalid stats file
ValueError – start_time or end_time are incorrectly formatted.
TypeError – start_time or end_time are invalid types.
- Return type:
List[Tuple[FrameTimecode, FrameTimecode]]
- scenedetect.open_video(path, framerate=None, backend='opencv', **kwargs)¶
Open a video at the given path. If backend is specified but not available on the current system, OpenCV (VideoStreamCv2) will be used as a fallback.
- Parameters:
path (str) – Path to video file to open.
framerate (float | None) – Overrides detected framerate if set.
backend (str) – Name of specific backend to use, if possible. See
scenedetect.backends.AVAILABLE_BACKENDSfor backends available on the current system. If the backend fails to open the video, OpenCV will be used as a fallback.kwargs – Optional named arguments to pass to the specified backend constructor for overriding backend-specific options.
- Returns:
Backend object created with the specified video path.
- Raises:
VideoOpenFailure – Constructing the VideoStream fails. If multiple backends have been attempted, the error from the first backend will be returned.
- Return type:
Module Reference¶
PySceneDetect Module Documentation
- Detection Algorithms
- Backends
- Video Files
- Devices / Cameras / Pipes
AVAILABLE_BACKENDSVideoCaptureAdapterVideoCaptureAdapter.read()VideoCaptureAdapter.reset()VideoCaptureAdapter.seek()VideoCaptureAdapter.BACKEND_NAMEVideoCaptureAdapter.aspect_ratioVideoCaptureAdapter.captureVideoCaptureAdapter.durationVideoCaptureAdapter.frame_numberVideoCaptureAdapter.frame_rateVideoCaptureAdapter.frame_sizeVideoCaptureAdapter.is_seekableVideoCaptureAdapter.nameVideoCaptureAdapter.pathVideoCaptureAdapter.positionVideoCaptureAdapter.position_ms
VideoStreamCv2VideoStreamCv2.read()VideoStreamCv2.reset()VideoStreamCv2.seek()VideoStreamCv2.BACKEND_NAMEVideoStreamCv2.aspect_ratioVideoStreamCv2.captureVideoStreamCv2.durationVideoStreamCv2.frame_numberVideoStreamCv2.frame_rateVideoStreamCv2.frame_sizeVideoStreamCv2.is_seekableVideoStreamCv2.nameVideoStreamCv2.pathVideoStreamCv2.positionVideoStreamCv2.position_ms
VideoStreamAvVideoStreamAv.read()VideoStreamAv.reset()VideoStreamAv.seek()VideoStreamAv.BACKEND_NAMEVideoStreamAv.aspect_ratioVideoStreamAv.durationVideoStreamAv.frame_numberVideoStreamAv.frame_rateVideoStreamAv.frame_sizeVideoStreamAv.is_seekableVideoStreamAv.nameVideoStreamAv.pathVideoStreamAv.positionVideoStreamAv.position_ms
VideoStreamMoviePyVideoStreamMoviePy.read()VideoStreamMoviePy.reset()VideoStreamMoviePy.seek()VideoStreamMoviePy.BACKEND_NAMEVideoStreamMoviePy.aspect_ratioVideoStreamMoviePy.durationVideoStreamMoviePy.frame_numberVideoStreamMoviePy.frame_rateVideoStreamMoviePy.frame_sizeVideoStreamMoviePy.is_seekableVideoStreamMoviePy.nameVideoStreamMoviePy.pathVideoStreamMoviePy.positionVideoStreamMoviePy.position_ms
- SceneManager
- Usage
- Storing Per-Frame Statistics
InterpolationSceneManagerSceneManager.add_detector()SceneManager.clear()SceneManager.clear_detectors()SceneManager.detect_scenes()SceneManager.get_num_detectors()SceneManager.get_scene_list()SceneManager.stop()SceneManager.auto_downscaleSceneManager.cropSceneManager.downscaleSceneManager.interpolationSceneManager.stats_manager
compute_downscale_factor()get_scenes_from_cuts()save_images()write_scene_list()write_scene_list_html()CropRegionCutListDEFAULT_MIN_WIDTHMAX_FRAME_QUEUE_LENGTHMAX_FRAME_SIZE_ERRORSPROGRESS_BAR_DESCRIPTIONSceneList
- Video Splitting
- StatsManager
- FrameTimecode
- SceneDetector
- VideoStream
FrameRateUnavailableSeekErrorVideoOpenFailureVideoStreamVideoStream.BACKEND_NAME()VideoStream.read()VideoStream.reset()VideoStream.seek()VideoStream.aspect_ratioVideoStream.base_timecodeVideoStream.durationVideoStream.frame_numberVideoStream.frame_rateVideoStream.frame_sizeVideoStream.is_seekableVideoStream.nameVideoStream.pathVideoStream.positionVideoStream.position_ms
- Platform & Logging
- Migration Guide
Logging¶
PySceneDetect outputs messages to a logger named pyscenedetect which does not have any default handlers. You can use scenedetect.init_logger with show_stdout=True or specify a log file (verbosity can also be specified) to attach some common handlers, or use logging.getLogger("pyscenedetect") and attach log handlers manually.
Migrating From 0.5¶
PySceneDetect 0.6 introduces several breaking changes which are incompatible with 0.5. See Migration Guide for details on how to update your application. In addition, demonstrations of common use cases can be found in the tests/test_api.py file.