Moviepy - video editing

онлайн тренажер по питону
Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

MoviePy for Python: Comprehensive Guide to Video Editing

Introduction to the MoviePy Library

Working with video has traditionally been associated with heavyweight tools and complex APIs. However, Python offers a library that makes video editing simple and expressive — MoviePy. It allows you to create, edit, combine, and export videos with minimal code.

MoviePy is built on top of FFmpeg and supports a wide range of video and audio formats. The library is convenient for generating dynamic clips, memes, programmatic editing, animation, and audio synchronization. MoviePy is widely used by developers to automate video production, create social‑media content, and process media files at scale.

The main advantages of MoviePy include its straightforward syntax, rich functionality, extensive format support, NumPy integration, and the ability to build complex compositions without deep knowledge of video codecs.

Installation and Setup of MoviePy

Installation via pip

pip install moviepy

Additional Dependencies

MoviePy requires FFmpeg. In most cases it is installed automatically, but if you encounter issues:

Windows:

# Via chocolatey
choco install ffmpeg

# Or download from the official website

macOS:

brew install ffmpeg

Linux:

sudo apt install ffmpeg  # Ubuntu/Debian
sudo yum install ffmpeg  # CentOS/RHEL

Verifying the Installation

from moviepy.editor import VideoFileClip
print("MoviePy installed successfully!")

Basics of Working with Video Files

Loading a Video

from moviepy.editor import VideoFileClip

# Load a video file
clip = VideoFileClip("video.mp4")

# Retrieve video information
print(f"Duration: {clip.duration} seconds")
print(f"Size: {clip.size}")
print(f"FPS: {clip.fps}")

Working with Various Formats

MoviePy supports a broad spectrum of video formats:

  • MP4, AVI, MOV, WMV
  • MKV, FLV, WebM
  • GIF (both as input and output)

Core Editing Operations

Trimming and Cutting

# Trim by time
clip_cut = clip.subclip(10, 20)  # from second 10 to 20

# Trim from start
clip_from_start = clip.subclip(0, 30)

# Trim to end
clip_to_end = clip.subclip(15)

# Remove a segment
clip_without_part = clip.cutout(5, 15)

Resizing and Quality Adjustment

# Resize by height
resized = clip.resize(height=480)

# Resize by width
resized = clip.resize(width=640)

# Proportional scaling
resized = clip.resize(0.5)  # 50% of original size

# Change FPS
fps_changed = clip.set_fps(30)

Rotation and Flipping

# Rotate 90 degrees
rotated = clip.rotate(90)

# Horizontal flip
from moviepy.video.fx import mirror_x
mirrored = mirror_x(clip)

# Vertical flip
from moviepy.video.fx import mirror_y
mirrored_y = mirror_y(clip)

Working with Text and Titles

Creating Text Clips

from moviepy.editor import TextClip, CompositeVideoClip

# Simple text
text = TextClip("Hello, world!", fontsize=70, color='white', font='Arial-Bold')
text = text.set_position('center').set_duration(5)

# Text with background
text_with_bg = TextClip("Title", fontsize=50, color='white',
                       bg_color='black', font='Arial')

Positioning Text

# Various positions
text_center = text.set_position('center')
text_top = text.set_position(('center', 'top'))
text_bottom = text.set_position(('center', 'bottom'))
text_custom = text.set_position((100, 200))  # x=100, y=200

# Moving text
def move_text(t):
    return (50 + t * 100, 100)  # moves left to right

moving_text = text.set_position(move_text)

Animating Text

# Fade in and out
animated_text = text.fadein(1).fadeout(1)

# More complex animation
text_animated = (text
                .set_duration(8)
                .fadein(2)
                .fadeout(2)
                .set_position(lambda t: ('center', 50 + t * 10)))

Composition and Clip Merging

Overlaying Clips

from moviepy.editor import CompositeVideoClip

# Create a composition
final = CompositeVideoClip([
    clip,           # main video
    text,           # text overlay
    logo_clip       # logo in corner
])

Sequential Concatenation

from moviepy.editor import concatenate_videoclips

# Stitch clips together
final = concatenate_videoclips([intro_clip, main_clip, outro_clip])

# With transitions
final = concatenate_videoclips([intro_clip, main_clip, outro_clip],
                              method="compose")

Transitions Between Clips

from moviepy.video.fx import crossfadein, crossfadeout

# Smooth transition
clip1 = clip1.crossfadeout(1)  # fade out over 1 second
clip2 = clip2.crossfadein(1)   # fade in over 1 second

# Merge with overlay
final = concatenate_videoclips([clip1, clip2], method="compose")

Audio and Soundtrack Handling

Extracting and Working with Audio

# Extract audio track
audio = clip.audio

# Save audio to file
audio.write_audiofile("extracted_audio.mp3")

# Remove audio from video
silent_clip = clip.without_audio()

Replacing and Overlaying Audio

from moviepy.editor import AudioFileClip

# Load new audio
new_audio = AudioFileClip("background_music.mp3")

# Replace audio track
clip_with_music = clip.set_audio(new_audio)

# Overlay audio (mixing)
from moviepy.audio.fx import volumex

# Lower original volume
quiet_original = clip.audio.fx(volumex, 0.3)

# Create mix
mixed_audio = CompositeAudioClip([quiet_original, new_audio])
final_clip = clip.set_audio(mixed_audio)

Synchronizing Audio and Video

# Delay audio relative to video
delayed_audio = audio.set_start(2)  # 2‑second delay

# Fit audio duration to video
fitted_audio = audio.set_duration(clip.duration)

# Loop short audio
looped_audio = audio.loop(duration=clip.duration)

Effects and Filters

Color Effects

from moviepy.video.fx import blackwhite, invert_colors, colorx

# Black‑and‑white video
bw_clip = blackwhite(clip)

# Invert colors
inverted = invert_colors(clip)

# Adjust color saturation
saturated = colorx(clip, 1.5)  # increase saturation by 50%

Speed Effects

# Speed up video
fast_clip = clip.speedx(2.0)  # 2× faster

# Slow down
slow_clip = clip.speedx(0.5)  # 2× slower

# Reverse playback
from moviepy.video.fx import time_mirror
reversed_clip = time_mirror(clip)

Transparency and Overlay Effects

# Set opacity
transparent_clip = clip.set_opacity(0.5)

# Mask from image
from moviepy.editor import ImageClip
mask = ImageClip("mask.png", ismask=True)
masked_clip = clip.set_mask(mask)

# Blur (via external library)
from moviepy.video.fx import blur
blurred = blur(clip, 1.5)

Creating Animations

Programmatic Clips

from moviepy.editor import ColorClip, VideoClip
import numpy as np

# Solid color background
red_bg = ColorClip(size=(640, 480), color=(255, 0, 0), duration=3)

# Animated gradient background
def make_gradient_frame(t):
    # Create a time‑varying gradient
    frame = np.zeros((480, 640, 3), dtype=np.uint8)
    frame[:, :, 0] = np.linspace(0, 255 * np.sin(t), 640)
    return frame

animated_bg = VideoClip(make_gradient_frame, duration=10)

Animating Objects

# Moving object
def moving_position(t):
    x = 50 + t * 100          # horizontal motion
    y = 240 + 100 * np.sin(t * 2)  # sinusoidal vertical motion
    return (x, y)

moving_text = text.set_position(moving_position)

# Scaling over time
def scaling_factor(t):
    return 0.5 + 0.5 * np.sin(t * 3)

scaling_text = text.resize(scaling_factor)

Working with Images

Creating a Slideshow

from moviepy.editor import ImageSequenceClip, concatenate_videoclips, ImageClip

# Build video from image sequence
image_files = ["img1.jpg", "img2.jpg", "img3.jpg"]
slideshow = ImageSequenceClip(image_files, fps=1)  # 1 frame per second

# Slideshow with transitions
clips = []
for img_file in image_files:
    img_clip = ImageClip(img_file, duration=3)
    img_clip = img_clip.fadein(0.5).fadeout(0.5)
    clips.append(img_clip)

slideshow_with_transitions = concatenate_videoclips(clips, method="compose")

Working with Frames

# Extract a frame at a specific time
frame_at_10s = clip.get_frame(10)  # frame at 10 seconds

# Save frame as an image
clip.save_frame("frame.png", t=10)

# Export all frames
clip.write_images_sequence("frames/frame%04d.png")

Export and Saving

Various Export Formats

# Standard MP4
final.write_videofile("output.mp4", fps=24, codec='libx264')

# High quality
final.write_videofile("output_hq.mp4", fps=30, bitrate="8000k")

# Optimized GIF
final.subclip(0, 10).resize(0.3).write_gif("output.gif", fps=15,
                                           opt="OptimizePlus")

# WebM for the web
final.write_videofile("output.webm", codec='libvpx')

Quality Settings

# Different quality presets
final.write_videofile("output.mp4", preset='ultrafast')  # fast encoding
final.write_videofile("output.mp4", preset='veryslow')   # best quality

# Manual parameter tuning
final.write_videofile("output.mp4",
                     fps=30,
                     bitrate="5000k",
                     audio_bitrate="320k",
                     temp_audiofile="temp_audio.m4a",
                     remove_temp=True)

MoviePy Methods and Functions Table

Core Creation Classes and Functions

Function / Class Description Example Usage
VideoFileClip(filename) Loads a video file as a clip object VideoFileClip("video.mp4")
AudioFileClip(filename) Loads an audio file AudioFileClip("audio.mp3")
ImageClip(filename, duration) Creates a video from a static image ImageClip("image.jpg", duration=5)
TextClip(txt, fontsize, color, font) Creates a text clip TextClip("Hello", fontsize=50, color='white')
ColorClip(size, color, duration) Generates a solid‑color video ColorClip((640,480), (255,0,0), duration=3)
CompositeVideoClip(clips) Combines multiple clips into one CompositeVideoClip([video, text])
concatenate_videoclips(clips) Stitches clips together sequentially concatenate_videoclips([clip1, clip2])
ImageSequenceClip(images, fps) Creates a video from an image sequence ImageSequenceClip(["1.jpg", "2.jpg"], fps=1)

Time and Duration Operations

Method Description Example Usage
clip.subclip(t_start, t_end) Cuts a segment from the video clip.subclip(10, 20)
clip.cutout(t_start, t_end) Removes a segment from the clip clip.cutout(5, 15)
clip.set_duration(t) Sets the clip duration clip.set_duration(30)
clip.set_start(t) Sets the start time of the clip clip.set_start(5)
clip.set_end(t) Sets the end time of the clip clip.set_end(25)
clip.loop(n, duration) Loops the clip clip.loop(duration=60)
clip.speedx(factor) Speeds up or slows down the clip clip.speedx(2.0)

Image Transformations

Method Description Example Usage
clip.resize(height, width) Scales the clip clip.resize(height=480)
clip.rotate(angle) Rotates the clip clip.rotate(90)
clip.crop(x1, y1, x2, y2) Crops a region of the frame clip.crop(100, 100, 500, 400)
clip.margin(size) Adds a border around the video clip.margin(10)
clip.set_position(pos) Positions the clip within the frame clip.set_position('center')
clip.set_opacity(alpha) Sets transparency clip.set_opacity(0.5)

Audio Operations

Method Description Example Usage
clip.set_audio(audio_clip) Replaces the audio track clip.set_audio(new_audio)
clip.without_audio() Removes sound from the clip clip.without_audio()
clip.volumex(factor) Adjusts volume clip.volumex(0.5)
audio.set_fps(fps) Changes audio sampling rate audio.set_fps(44100)

Effects and Transitions

Method Description Example Usage
clip.fadein(duration) Smooth fade‑in clip.fadein(2)
clip.fadeout(duration) Smooth fade‑out clip.fadeout(2)
clip.crossfadein(duration) Cross‑fade in with overlay clip.crossfadein(1)
clip.crossfadeout(duration) Cross‑fade out with overlay clip.crossfadeout(1)
clip.fx(effect, *args) Applies an effect to the clip clip.fx(vfx.blackwhite)

Saving Methods

Method Description Example Usage
clip.write_videofile(filename) Saves the video file clip.write_videofile("output.mp4", fps=24)
clip.write_gif(filename) Saves the clip as a GIF clip.write_gif("output.gif")
clip.write_images_sequence(folder) Saves frames as images clip.write_images_sequence("frames/")
clip.save_frame(filename, t) Saves a frame at a specific time clip.save_frame("frame.png", t=10)
audio.write_audiofile(filename) Saves only the audio track audio.write_audiofile("sound.mp3")

Clip Information Retrieval

Attribute / Method Description Example Usage
clip.duration Clip duration in seconds print(clip.duration)
clip.fps Frames per second print(clip.fps)
clip.size Frame size (width, height) print(clip.size)
clip.w, clip.h Width and height separately print(f"{clip.w}x{clip.h}")
clip.get_frame(t) Gets a frame at a given time frame = clip.get_frame(10)
clip.iter_frames() Iterator over frames for frame in clip.iter_frames(): ...

Practical Usage Examples

Automatic Video Preview Generation

def create_video_preview(input_file, output_file, preview_duration=30):
    """Create a preview video from several short segments"""
    clip = VideoFileClip(input_file)
    
    # Extract three 10‑second segments from different parts
    duration = clip.duration
    fragments = []
    
    for i in range(3):
        start_time = duration * (i + 1) / 4 - 5
        fragment = clip.subclip(start_time, start_time + 10)
        fragments.append(fragment)
    
    # Concatenate segments
    preview = concatenate_videoclips(fragments)
    
    # Add watermark
    watermark = TextClip("PREVIEW", fontsize=30, color='white',
                        font='Arial-Bold').set_opacity(0.7)
    watermark = watermark.set_position(('right', 'bottom')).set_duration(preview_duration)
    
    final = CompositeVideoClip([preview, watermark])
    final.write_videofile(output_file, fps=24)
    
    clip.close()
    final.close()

# Example usage
create_video_preview("long_video.mp4", "preview.mp4")

Creating a Photo Slideshow with Music

def create_photo_slideshow(image_folder, audio_file, output_file):
    """Generate a slideshow from photos with background music"""
    import os
    
    # Gather image files
    images = [f for f in os.listdir(image_folder)
              if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
    images.sort()
    
    # Create clips from images
    clips = []
    for img in images:
        img_path = os.path.join(image_folder, img)
        img_clip = ImageClip(img_path, duration=3)
        img_clip = img_clip.resize(height=720).fadein(0.5).fadeout(0.5)
        clips.append(img_clip)
    
    # Concatenate images
    video = concatenate_videoclips(clips, method="compose")
    
    # Add music
    audio = AudioFileClip(audio_file)
    audio = audio.loop(duration=video.duration)
    
    final = video.set_audio(audio)
    final.write_videofile(output_file, fps=24)
    
    # Release resources
    video.close()
    audio.close()
    final.close()

# Example usage
create_photo_slideshow("photos/", "background_music.mp3", "slideshow.mp4")

Automatic Subtitle Addition

def add_subtitles(video_file, subtitles_data, output_file):
    """Add subtitles to a video
    
    subtitles_data: list of tuples [(start_time, end_time, text), ...]
    """
    clip = VideoFileClip(video_file)
    subtitle_clips = []
    
    for start, end, text in subtitles_data:
        subtitle = TextClip(text, fontsize=40, color='white',
                           font='Arial-Bold', stroke_color='black',
                           stroke_width=2)
        subtitle = (subtitle.set_position(('center', 'bottom'))
                           .set_start(start)
                           .set_duration(end - start))
        subtitle_clips.append(subtitle)
    
    # Create composition
    final = CompositeVideoClip([clip] + subtitle_clips)
    final.write_videofile(output_file, fps=clip.fps)
    
    clip.close()
    final.close()

# Example usage
subtitles = [
    (0, 3, "Welcome!"),
    (3, 7, "This is a subtitle demo"),
    (7, 10, "Using MoviePy")
]
add_subtitles("input.mp4", subtitles, "with_subtitles.mp4")

Performance Optimization

Memory Management

# Explicitly close clips to free memory
clip = VideoFileClip("large_video.mp4")
# ... work with clip
clip.close()

# Recommended: use a context manager
with VideoFileClip("video.mp4") as clip:
    processed = clip.subclip(10, 20)
    processed.write_videofile("output.mp4")

Multithreading

# Use multiple threads during export
clip.write_videofile("output.mp4", threads=4, fps=24)

# For large projects, preview at low quality
preview = clip.resize(0.25)  # 25% of original size
preview.preview()  # fast preview

Frequently Asked Questions and Solutions

How to Fix Codec Issues?

If you encounter codec errors, try:

# Explicitly specify codec
clip.write_videofile("output.mp4", codec='libx264', audio_codec='aac')

# Use alternative codecs
clip.write_videofile("output.mp4", codec='mpeg4')

# For older systems
clip.write_videofile("output.mp4", codec='libx264', preset='ultrafast')

How to Work with Very Large Video Files?

# Process in chunks
def process_large_video(input_file, output_file, chunk_duration=60):
    clip = VideoFileClip(input_file)
    total_duration = clip.duration
    
    processed_chunks = []
    for start in range(0, int(total_duration), chunk_duration):
        end = min(start + chunk_duration, total_duration)
        chunk = clip.subclip(start, end)
        # Example processing
        processed_chunk = chunk.resize(height=720)
        processed_chunks.append(processed_chunk)
    
    final = concatenate_videoclips(processed_chunks)
    final.write_videofile(output_file)
    
    clip.close()
    final.close()

How to Speed Up Video Export?

# Fast settings for testing
clip.write_videofile("test.mp4", preset='ultrafast', fps=15)

# Optimal settings for final render
clip.write_videofile("final.mp4",
                    preset='medium',   # balance speed and quality
                    fps=24,
                    threads=4,         # use multiple cores
                    bitrate='3000k')   # control quality

How to Add Watermarks?

# Simple text watermark
watermark = (TextClip("© My Channel", fontsize=30, color='white', font='Arial')
            .set_opacity(0.7)
            .set_position(('right', 'bottom'))
            .set_duration(clip.duration))

# Image watermark
logo = (ImageClip("logo.png")
        .set_duration(clip.duration)
        .resize(height=50)
        .set_opacity(0.8)
        .set_position(('right', 'top')))

final = CompositeVideoClip([clip, watermark, logo])

Comparison with Other Tools

Tool Video Support Audio Support Text Support Animations Complexity Level Performance
MoviePy Excellent Excellent Excellent Good Low Medium
OpenCV Good Limited Limited Limited High High
FFmpeg (CLI) Excellent Excellent Limited Good Very High Very High
Adobe Premiere Pro Excellent Excellent Excellent Excellent Medium High
DaVinci Resolve Excellent Excellent Excellent Excellent Medium Very High

When to Use MoviePy

Ideal for:

  • Automating video processing
  • Programmatically creating simple videos
  • Rapid prototyping
  • Batch file processing
  • Integration with web applications
  • Learning video editing basics

Not recommended for:

  • Professional editing with high performance demands
  • Real‑time video work
  • Advanced color grading
  • Complex visual effects

Real‑World Project Examples

Social‑Media Content Generation

def create_social_media_video(image, title, duration=15):
    """Generate a social‑media video from an image and title"""
    
    # Background image
    bg = ImageClip(image, duration=duration).resize((1080, 1920))  # Instagram Stories
    
    # Title text
    title_clip = (TextClip(title, fontsize=80, color='white',
                           font='Arial-Bold', stroke_color='black', stroke_width=3)
                 .set_position('center')
                 .set_duration(duration)
                 .fadein(1).fadeout(1))
    
    # Animated zoom effect
    def zoom_effect(t):
        return 1 + 0.1 * t / duration  # gradual zoom
    
    bg_animated = bg.resize(zoom_effect)
    
    # Background music
    audio = AudioFileClip("upbeat_music.mp3").subclip(0, duration).fadeout(2)
    
    final = CompositeVideoClip([bg_animated, title_clip]).set_audio(audio)
    return final

Automatic Podcast Clip Generation

def create_podcast_clips(audio_file, timestamps, output_folder):
    """Create podcast video clips based on timestamps"""
    
    audio = AudioFileClip(audio_file)
    
    for i, (start, end, title) in enumerate(timestamps):
        # Audio segment
        clip_audio = audio.subclip(start, end)
        
        # Visual background
        bg = ColorClip((1920, 1080), color=(30, 30, 30), duration=clip_audio.duration)
        
        # Episode title
        title_text = (TextClip(title, fontsize=60, color='white', font='Arial-Bold')
                     .set_position('center')
                     .set_duration(clip_audio.duration))
        
        # Simple audio visualizer (pulsing circle)
        def pulse_effect(t):
            return 0.8 + 0.2 * abs(np.sin(t * 10))  # pulse animation
        
        pulse_circle = (ColorClip((200, 200), color=(255, 100, 100), duration=clip_audio.duration)
                       .resize(pulse_effect)
                       .set_position('center'))
        
        # Compose video
        video_clip = CompositeVideoClip([bg, pulse_circle, title_text]).set_audio(clip_audio)
        
        # Save
        output_file = f"{output_folder}/clip_{i+1:02d}_{title[:20]}.mp4"
        video_clip.write_videofile(output_file, fps=24)
        
        video_clip.close()
    
    audio.close()

Conclusion

MoviePy is a powerful and accessible video‑editing library for Python that opens up extensive possibilities for automating video production. Its main strengths—ease of use, rich functionality, and excellent documentation—make it an ideal choice for developers needing to integrate video processing into their projects.

The library excels at creating automated content generation pipelines, batch video processing, and dynamic video creation. While it has some performance limitations with extremely large files, MoviePy remains a solid tool for both learning basic video editing and tackling practical media‑production tasks.

For best results, combine MoviePy with other Python ecosystem tools such as NumPy for array manipulation, Pillow for image handling, and apply memory‑optimization principles when working on large‑scale projects.

News