Skip to main content
All notable changes to MovieLite are documented here. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

Added

Playback Speed Control

New set_speed() method for all clip types allows you to control playback speed:
clip.set_speed(2.0)  # 2x speed
clip.set_speed(0.5)  # Slow motion

Rotation Support

Rotation support via set_rotation() method and vfx.Rotation effect:
clip.set_rotation(45)  # Static rotation
clip.add_effect(vfx.Rotation(angle=90))

Fixed

  • AlphaVideoClip.subclip() preservation: Now correctly returns AlphaVideoClip instead of VideoClip, preserving transparency and loop behavior

[0.2.1] - 2025-11-15

Changed

Breaking change: CompositeClip and AlphaCompositeClip constructor signatures have changed.
  • CompositeClip signature update: Constructor now requires explicit start parameter with optional duration:
    # Old (v0.2.0)
    composite = CompositeClip(clips=[clip1, clip2])
    
    # New (v0.2.1)
    composite = CompositeClip(clips=[clip1, clip2], start=0, duration=10)
    # duration is optional and auto-calculated if not provided
    composite = CompositeClip(clips=[clip1, clip2], start=0)
    
  • The duration parameter is optional and will be auto-calculated from child clips if not provided
  • This change applies to both CompositeClip and AlphaCompositeClip

[0.2.0] - 2025-11-15

Added

Composite Clips

New CompositeClip and AlphaCompositeClip classes for grouping multiple clips as a single unit:
from movielite import CompositeClip

composite = CompositeClip(
    clips=[background, overlay, text],
    start=0
)

High-Precision Blending

New high_precision_blending parameter for fine control over blending precision:
# In VideoWriter
writer.write(high_precision_blending=True)

# In CompositeClip
composite = CompositeClip(
    clips=[...],
    high_precision_blending=True
)

Changed

Performance improvement: Default blending mode is now faster with uint8 precision.
  • Background frame precision: Background frames now use uint8 by default during blending instead of float32
  • This reduces memory usage and improves rendering speed for most use cases
  • float32 precision is now opt-in via high_precision_blending=True
  • High-precision mode recommended only for:
    • Multiple layers with transparency
    • Subtle gradients requiring high color accuracy
    • Complex alpha compositing
Performance impact:
  • uint8 mode (default): ~15-25% faster rendering, lower memory usage
  • float32 mode (opt-in): Maximum color accuracy, higher memory usage

Fixed

  • Clip ordering preservation: Replaced internal set with list to maintain proper z-order for composition and blending
  • Video subclipping: VideoClip.subclip() now correctly copies pixel transforms to the new clip instance

[0.1.1] - 2025-11-09

Fixed

Critical fix: Memory leak when rendering multiple video clips.Problem: All video clips remained open in memory until the end of rendering, causing memory exhaustion on long projects.Solution: Clips are now closed progressively as they finish rendering, freeing resources immediately.Impact: Dramatically reduced memory usage for projects with many clips or long videos.
Improvement: Zoom and position calculations now support float values.Problem: Position calculations truncated decimal values, causing jumpy animations.Solution: Float positions are now properly rounded instead of truncated.Note: Subpixel rendering is not supported, but rounding provides smoother animation than truncation.

[0.1.0] - 2025-11-08

Initial Release

First public release of MovieLite!

Features

Core Functionality:
  • Frame-by-frame video processing
  • VideoClip, AlphaVideoClip for video handling
  • ImageClip for static images
  • TextClip with pictex integration
  • AudioClip for audio tracks
  • VideoWriter for composition and rendering

Capabilities

Video:
  • Load and manipulate video files
  • Alpha video support (transparency)
  • Image clips (static images as frames)
  • Text rendering with advanced styling
  • Mask support for compositing
  • Video looping
  • Playback speed control
  • Subclip extraction
Audio:
  • Audio clip loading and mixing
  • Volume control and curves
  • Audio effects (fade in/out)
  • Multiple audio track mixing
  • Sample-level access
Output:
  • MP4 container format
  • H.264 video codec (libx264)
  • AAC audio codec
  • Quality presets: LOW, MIDDLE, HIGH, VERY_HIGH

Requirements

  • Python 3.10-3.13
  • FFmpeg (must be in PATH)
  • NumPy
  • OpenCV (opencv-python)
  • Numba
  • multiprocess
  • tqdm
  • pictex

Version Naming Convention

MovieLite follows Semantic Versioning:
  • MAJOR version (X.0.0): Incompatible API changes
  • MINOR version (0.X.0): New functionality in a backwards-compatible manner
  • PATCH version (0.0.X): Backwards-compatible bug fixes

Upgrade Guide

Upgrading to 0.2.1 from 0.2.0

If you use CompositeClip or AlphaCompositeClip, update constructor calls:
# Before (0.2.0)
composite = CompositeClip(clips=[clip1, clip2])

# After (0.2.1)
composite = CompositeClip(clips=[clip1, clip2], start=0)
# or with explicit duration
composite = CompositeClip(clips=[clip1, clip2], start=0, duration=10)

Upgrading to 0.2.0 from 0.1.x

1

Review blending precision

Default blending is now uint8 for better performance. If you need maximum color accuracy:
writer.write(high_precision_blending=True)
2

Test clip ordering

Clip z-order is now preserved correctly. Verify that your compositions render in the expected order.
3

Check subclip transforms

Subclips now inherit pixel transforms. Verify that extracted subclips behave as expected.

Deprecation Policy

MovieLite aims to maintain backwards compatibility whenever possible. When breaking changes are necessary:
  1. The old API will be deprecated for at least one minor version
  2. Deprecation warnings will be issued
  3. Migration guides will be provided
  4. Breaking changes are noted clearly in changelog

Contributing

See Contributing Guide for information on how to contribute to MovieLite.

Build docs developers (and LLMs) love