Turn screenshots and images into polished demo videos with Ken Burns pan/zoom effects, crossfade transitions, and text overlays. Built for hackathon teams and OSS projects that need showcase content without video editing software.
ffmpeg -loop 1 -t 4 -i slide1.png \
-loop 1 -t 4 -i slide2.png \
-loop 1 -t 4 -i slide3.png \
-filter_complex \
"[0:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=3:d=1[v0]; \
[1:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=3:d=1[v1]; \
[2:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1[v2]; \
[v0][v1][v2]concat=n=3:v=1:a=0[out]" \
-map "[out]" -c:v libx264 -pix_fmt yuv420p output.mp4
# Slow zoom in over 5 seconds
ffmpeg -loop 1 -t 5 -i image.png -filter_complex \
"scale=8000:-1,zoompan=z='min(zoom+0.0015,1.5)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=150:s=1920x1080:fps=30" \
-c:v libx264 -pix_fmt yuv420p -t 5 zoomed.mp4
# macOS: use /System/Library/Fonts/Helvetica.ttc
ffmpeg -i input.mp4 -vf \
"drawtext=text='Built in 48 Hours':fontfile=/System/Library/Fonts/Helvetica.ttc:fontsize=48:fontcolor=white:x=(w-text_w)/2:y=h-80:enable='between(t,2,5)'" \
-c:v libx264 -c:a copy output.mp4
ffmpeg -f lavfi -i "color=c=0x6366F1:s=1920x1080:d=3" -vf \
"drawtext=text='Your Project Name':fontfile=/System/Library/Fonts/Helvetica.ttc:fontsize=72:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2" \
-c:v libx264 -pix_fmt yuv420p title.mp4
# Create concat list
echo "file 'title.mp4'" > concat.txt
echo "file 'slides.mp4'" >> concat.txt
echo "file 'closing.mp4'" >> concat.txt
ffmpeg -f concat -safe 0 -i concat.txt -c copy final.mp4
/System/Library/Fonts/Helvetica.ttc — if drawtext fails, check this first-pix_fmt yuv420p — without it, some players show a green screenfrom PIL import Image, ImageDraw, ImageFont-shortest cuts video at audio end — when VO is shorter than video, always pad audio: -af "apad=whole_dur=90" or generate silence to filladelay — generate each narration line separately, then mix with adelay=| and amix=inputs=N:duration=longest:normalize=0, then add apad to hit target durationzoompan needs explicit d= where frames = duration fps. Calculate with python3 -c "print(int(dur 30))"scripts/build_showcase.sh — Complete showcase builder script with configurable sections共 2 个版本