ClipSmith
Utility to work with video clips, especially suited for dashcam footage
Overview
This project leverages FFmpeg and doit to provide a user-friendly utility for working with video clips and orchestrating pipelines of video editing operations. Clips can be readily concatenated, trimmed, and/or rescaled in a single command. This is especially useful for working with dashcam footage wherein there are many short video files to manage.
Getting started
First, ensure you have ffmpeg installed:
# Ubuntu/Debian
sudo apt install ffmpeg
# macOS
brew install ffmpeg
# Windows
# Download from https://ffmpeg.org/download.html
Then install using pip:
pip install clipsmith
CLI
Forging clips
The command clipsmith forge is the entry point for creating new clips. Operations for concatenation, duration trimming, duration scaling, resolution scaling, and audio can be specified together in one command.
Usage: clipsmith forge [OPTIONS] INPUTS... OUTPUT
Create a video from one or more videos with specified operations applied
╭─ Arguments ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * inputs INPUTS... One or more paths to input video(s) or folder(s) of videos [default: None] [required] │
│ * output PATH Path to output video [default: None] [required] │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --trim-start FLOAT Start offset (seconds) in input file(s) [default: None] │
│ --trim-end FLOAT End offset (seconds) in input file(s) [default: None] │
│ --dur-scale FLOAT Scale duration by scale factor [default: None] │
│ --dur-target FLOAT Scale duration to target (seconds) [default: None] │
│ --res-scale FLOAT Scale resolution by scale factor [default: None] │
│ --res-target TEXT Scale resolution to target as WIDTH:HEIGHT [default: None] │
│ --audio --no-audio Whether to pass through audio to output (not yet supported with time scaling) [default: audio] │
│ --cache --no-cache Whether to store a cache of video metadata in input folders [default: no-cache] │
│ --log-level TEXT Log level passed to ffmpeg [default: info] │
│ --help Show this message and exit. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Concatenating
Concatenate multiple clips into a single one:
# Combine specific files
clipsmith forge clip1.mp4 clip2.mp4 combined.mp4
# Combine all clips from a folder
clipsmith forge input_folder/ combined.mp4
For any folders passed as inputs, their contents are recursively scanned depth-first to aggregate input videos.
Trimming
Trim clips using start and end time offsets:
# Trim to specific time range
clipsmith forge --trim-start 1.0 --trim-end 5.0 input.mp4 output.mp4
# Trim just the start
clipsmith forge --trim-start 1.0 input.mp4 output.mp4
# Trim just the end
clipsmith forge --trim-end 5.0 input.mp4 output.mp4
Rescaling
Rescale video duration and resolution:
# Speed up by factor (e.g. 2x faster)
clipsmith forge --dur-scale 2.0 --no-audio input.mp4 output.mp4
# Slow down by factor (e.g. 2x slower)
clipsmith forge --dur-scale 0.5 --no-audio input.mp4 output.mp4
# Rescale duration to specific value in seconds
clipsmith forge --dur-target 60.0 --no-audio input.mp4 output.mp4
# Rescale resolution by factor
clipsmith forge --res-scale 0.5 input.mp4 output.mp4
# Rescale resolution to specific value as WIDTH:HEIGHT
clipsmith forge --res-target 480:270 input.mp4 output.mp4
Input folder caching
For input folders with many videos, the process of scanning and validating input files can be time-consuming. In such cases, pass --cache to cache video metadata per folder. In case of multiple or interrupted invocations, ClipSmith will use this cache to quickly begin its work.
API
Context
The Context class provides the main interface for working with clips. It implements a task orchestration pattern using doit:
from pathlib import Path
from clipsmith import Context
# Create a context
context = Context()
# Forge a new clip from input files
context.forge("output.mp4", [Path("input1.mp4"), Path("input2.mp4")])
# Execute all pending operations
context.doit()
Clips
Clips can be manipulated using operation parameters for duration and resolution. A clip can be "reforged" into another clip, with doit managing orchestration of ffmpeg invocations.
from clipsmith import (
Context,
OperationParams,
DurationParams,
ResolutionParams
)
context = Context()
inputs = [Path("input1.mp4"), Path("input2.mp4")]
# Trimming
clip1 = context.forge(
"output1.mp4",
inputs,
OperationParams(
duration_params=DurationParams(
trim_start=1.0, # Start at 1 second
trim_end=5.0, # End at 5 seconds
),
)
)
# Time scaling
clip2 = context.forge(
"output2.mp4",
inputs,
OperationParams(
duration_params=DurationParams(
scale=2.0, # Speed up by 2x
),
audio=False
)
)
# Resolution scaling
clip3 = context.forge(
"output3.mp4",
inputs,
OperationParams(
resolution_params=ResolutionParams(
target=(480, 270) # Scale to specific resolution
)
)
)
# Chain operations by reforging trimmed clip
clip4 = clip1.reforge(
"output4.mp4",
OperationParams(
resolution_params=ResolutionParams(
scale=0.5 # Scale resolution by factor
)
)
)
# Execute all operations
context.doit()
Metadata
Release files for clipsmith 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| clipsmith-0.2.1.tar.gz | 14.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| clipsmith-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.6 kB
Release files / clipsmith-0.2.1.tar.gz
| Download URL | clipsmith-0.2.1.tar.gz |
|---|---|
| Size | 14.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2cb2619b79e93d23f3ec5b66637136fbaca73d829d71f57fcfb84fdf0f41366f
|
|
BLAKE2b-256 checksum How to use checksums |
f5d27478a9d7061cfe45277bb685bf7674d98225a6e94cc9677355b0f6d34c91
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.1.3 CPython/3.12.6 Linux/5.15.0-151-generic
|
Release files / clipsmith-0.2.1-py3-none-any.whl
| Download URL | clipsmith-0.2.1-py3-none-any.whl |
|---|---|
| Size | 16.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
74fcfa6900f6b517cfc1d39e300a62887c6c0209725aec33ff570a75d07d2e56
|
|
BLAKE2b-256 checksum How to use checksums |
a5b132dbe03345d7a6317a84a0fb8e7dcf0674cb5c05f6d0a984f426768a9da8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.1.3 CPython/3.12.6 Linux/5.15.0-151-generic
|
Security for clipsmith 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.