Skip to main content
MovieLite provides fine-grained control over audio tracks, allowing you to mix multiple audio sources, apply effects, and synchronize audio with video.
View the complete source code: video_audio_control.py

Accessing Video Audio

Every VideoClip has an audio property that gives you access to its audio track:
from movielite import VideoClip, VideoWriter

video = VideoClip("input.mp4", start=0, duration=10)

# Access the audio track
print(f"Audio duration: {video.audio.duration}s")
print(f"Audio start: {video.audio.start}s")
print(f"Audio volume: {video.audio.volume}")

Modifying Video Audio

Apply effects and adjustments to the video’s built-in audio track:
from movielite import VideoClip, VideoWriter, afx

video = VideoClip("sample.mp4", start=0, duration=10)

# Modify the audio track
video.audio.add_effect(afx.FadeIn(2.0))
video.audio.add_effect(afx.FadeOut(2.0))
video.audio.set_volume(0.7)

writer = VideoWriter("output_with_faded_audio.mp4", duration=10)
writer.add_clip(video)
writer.write()
Changes to video.audio automatically apply to the video when rendered. The audio stays synchronized with the video.

Audio Effects

Fade In

Gradually increase volume from silence:
video.audio.add_effect(afx.FadeIn(duration=2.0))

Fade Out

Gradually decrease volume to silence:
video.audio.add_effect(afx.FadeOut(duration=2.0))

Volume Control

Set the overall volume level:
video.audio.set_volume(0.5)  # 50% volume
video.audio.set_volume(1.0)  # 100% volume (default)
video.audio.set_volume(1.5)  # 150% volume (amplify)
video.audio.add_effect(afx.FadeIn(2.0)).add_effect(afx.FadeOut(2.0))

Adding Background Music

Mix background music with your video’s audio:
from movielite import VideoClip, AudioClip, VideoWriter

video = VideoClip("sample.mp4", start=0, duration=10)

# Reduce video audio volume
video.audio.set_volume(0.3)

# Add background music
music = AudioClip("music.mp3", start=0, duration=10)
music.set_volume(0.7)

writer = VideoWriter("output_with_music.mp4", duration=10)
writer.add_clip(video)
writer.add_clip(music)
writer.write()

Audio Mixing Behavior

When multiple audio tracks overlap, MovieLite mixes them together:
  • Audio is added together (not replaced)
  • Adjust volumes to prevent clipping
  • Total volume of overlapping tracks shouldn’t exceed 1.0
If you have video audio at 0.7 and music at 0.7, the combined volume is 1.4, which may cause audio distortion. Balance your volumes accordingly.

Offsetting Audio from Video

Delay or advance audio relative to video:
video = VideoClip("sample.mp4", start=0, duration=10)

# Video starts at 0, but audio starts at 2 seconds
video.audio._start = 2.0

writer = VideoWriter("output_audio_delayed.mp4", duration=12)
writer.add_clip(video)
writer.write()
Using _start directly breaks audio-video sync. Use this carefully and only when you specifically need independent audio timing.

Synchronized Timing Changes

When you modify video timing, audio automatically stays synchronized:
video = VideoClip("sample.mp4", start=0, duration=10)

# Both video and audio start at 5 seconds
video.set_start(5.0)

# Both video and audio are 8 seconds long
video.set_duration(8.0)

writer = VideoWriter("output_synced.mp4", duration=15)
writer.add_clip(video)
writer.write()

Multiple Audio Tracks

Create complex audio mixes with multiple AudioClip instances:
from movielite import VideoClip, AudioClip, VideoWriter, afx

video = VideoClip("video.mp4", start=0, duration=30)
video.audio.set_volume(0.4)  # Reduce original audio

# Background music (full duration)
music = AudioClip("background.mp3", start=0, duration=30, volume=0.3)
music.add_effect(afx.FadeIn(2.0))
music.add_effect(afx.FadeOut(3.0))

# Sound effect at 5 seconds
sfx1 = AudioClip("whoosh.wav", start=5.0, volume=0.8)

# Another sound effect at 10 seconds
sfx2 = AudioClip("ding.wav", start=10.0, volume=0.6)

# Voiceover from 15-25 seconds
voiceover = AudioClip("narration.mp3", start=15.0, duration=10, volume=0.9)
voiceover.add_effect(afx.FadeIn(0.5))
voiceover.add_effect(afx.FadeOut(0.5))

writer = VideoWriter("output_multi_audio.mp4", duration=30)
writer.add_clip(video)
writer.add_clips([music, sfx1, sfx2, voiceover])
writer.write()

Audio Timeline Visualization

         0s    5s    10s   15s   20s   25s   30s
Video    [====================================]
Music    [fade in===================fade out---]
SFX1               [whoosh]
SFX2                         [ding]
Voice                         [fade in====fade out]

Ducking (Lowering Background Music)

Duck background music when voiceover plays:
video = VideoClip("video.mp4", start=0, duration=30)
video.audio.set_volume(0.2)

# Full volume music for intro
music_intro = AudioClip("music.mp3", start=0, duration=10, volume=0.6)
music_intro.add_effect(afx.FadeOut(1.0))

# Ducked music during voiceover
music_ducked = AudioClip("music.mp3", start=9, duration=12, volume=0.2)

# Voiceover
voiceover = AudioClip("narration.mp3", start=10, duration=10, volume=0.9)

# Full volume music for outro
music_outro = AudioClip("music.mp3", start=20, duration=10, volume=0.6)
music_outro.add_effect(afx.FadeIn(1.0))

writer = VideoWriter("output_ducked.mp4", duration=30)
writer.add_clip(video)
writer.add_clips([music_intro, music_ducked, voiceover, music_outro])
writer.write()
This technique keeps background music playing but reduces its volume during important narration or dialogue.

Looping Audio

Loop a short audio clip to match video duration:
video = VideoClip("video.mp4", start=0, duration=60)

# Short music track that needs to loop
music = AudioClip("loop.mp3", start=0, duration=60, volume=0.4)
music.loop(True)  # Enable looping
music.add_effect(afx.FadeIn(2.0))
music.add_effect(afx.FadeOut(2.0))

writer = VideoWriter("output_looped_audio.mp4", duration=60)
writer.add_clip(video)
writer.add_clip(music)
writer.write()

Extracting Audio from Video

Use a video’s audio track as a standalone audio source:
video1 = VideoClip("video1.mp4", start=0, duration=10)
video2 = VideoClip("video2.mp4", start=0, duration=10)

# Use video2's audio but video1's visuals
video1.audio.set_volume(0)  # Mute video1's original audio

writer = VideoWriter("output_swapped_audio.mp4", duration=10)
writer.add_clip(video1)
writer.add_clip(video2.audio)  # Add video2's audio track
writer.write()

Removing Audio from Video

Create a silent video:
video = VideoClip("video.mp4", start=0, duration=10)
video.audio.set_volume(0)  # Mute the audio

writer = VideoWriter("output_silent.mp4", duration=10)
writer.add_clip(video)
writer.write()
Or set the audio to None:
video.audio = None

Audio Format Support

MovieLite supports common audio formats:
  • MP3 - Most common, compressed
  • WAV - Uncompressed, high quality
  • AAC - Modern compressed format
  • FLAC - Lossless compression
  • OGG - Open source compressed format
Support depends on your FFmpeg installation. Most standard formats work out of the box.

Common Audio Mixing Patterns

Background Music Throughout

video = VideoClip("video.mp4")
video.audio.set_volume(0.4)

music = AudioClip("music.mp3", start=0, duration=video.duration, volume=0.3)
music.add_effect(afx.FadeIn(2.0))
music.add_effect(afx.FadeOut(2.0))

Sound Effects at Specific Times

sfx_times = [5.0, 10.0, 15.0, 20.0]
sfx_clips = [
    AudioClip("sfx.wav", start=t, volume=0.7)
    for t in sfx_times
]

writer.add_clips(sfx_clips)

Crossfade Between Audio Tracks

track1 = AudioClip("song1.mp3", start=0, duration=30, volume=0.5)
track1.add_effect(afx.FadeOut(3.0))  # Fade out last 3 seconds

track2 = AudioClip("song2.mp3", start=27, duration=30, volume=0.5)
track2.add_effect(afx.FadeIn(3.0))  # Fade in first 3 seconds

# 3 second overlap creates crossfade

Volume Guidelines

Recommended volume levels:
  • Primary audio (dialogue, voiceover): 0.8 - 1.0
  • Background music: 0.2 - 0.4
  • Sound effects: 0.5 - 0.8
  • Ambient sounds: 0.1 - 0.3
Adjust based on your content and prevent total volume from exceeding 1.0 to avoid clipping.

Troubleshooting

Audio and video out of sync

  • Ensure you’re not modifying audio._start unless needed
  • Use set_start() and set_duration() on the video clip, not the audio directly

Audio distortion or clipping

  • Total volume of overlapping tracks is too high
  • Reduce individual track volumes
  • Use volume levels that sum to ≤ 1.0

No audio in output

  • Check video.audio is not None
  • Verify volume is not set to 0
  • Ensure audio track duration overlaps with video

Background music too loud

  • Reduce music volume to 0.2 - 0.4
  • Increase video audio volume if needed
  • Use ducking technique during dialogue

Performance Considerations

  • Audio mixing happens during rendering
  • Multiple audio tracks have minimal performance impact
  • Audio effects are lightweight
  • Large audio files (>100MB) may use more memory

Next Steps

Effects Showcase

Learn about audio and visual effects

Advanced Compositing

Combine audio with complex video compositions

AudioClip API

Complete AudioClip API reference

Audio Effects API

Audio effects documentation

Build docs developers (and LLMs) love