---
title: "How to add a photo slideshow with Claude (tested prompt and ffmpeg command)"
description: "Four frozen product photos take turns on screen, each one held perfectly still for a beat and then dissolving into the next every 1.5 seconds. Install one skill and ask Claude Code, or run the ffmpeg command we tested yourself."
url: https://www.recharm.com/effects/photo-slideshow
---

# How to add a photo slideshow with Claude

Four frozen product photos take turns on screen, each one held perfectly still for a beat and then dissolving into the next every 1.5 seconds.

Made by the command on this page, from our own test clips.

## Get this effect

1. ### Switch to Code in your [Claude Desktop App](https://claude.com/download)

2. ### Install the skill (once)

   ```
   Install the Recharm video effects skill: download https://recharm-growth-staging.s3.us-east-2.amazonaws.com/website/downloads/recharm-video-effects.zip and unzip it into ~/.claude/skills
   ```

3. ### Ask for the effect

   ```
   Make a photo slideshow from clipA.mp4 and clipB.mp4
   Photos: clipA 0.5s, clipB 1.5s, clipA 4.0s, clipB 5.0s
   ```

## Several videos, several effects, one ask

Put your clips in the folder, mention them with @, and ask for everything at once. Claude runs one tested script after another on each clip, then joins them.

Add a photo slideshow to **@clip1.mp4**, put a sale badge on **@clip2.mp4**, give **@clip3.mp4** a VHS look, then join all three with crossfades.

## Settings you can change

Ask Claude to change any of these, or edit them at the top of the command.

| Setting  | Default                                          | What it does                                                                                                      |
| -------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
| `HOLD`   | `1.5`                                            | Seconds between one photo and the next starting to fade in.                                                       |
| `FADE`   | `0.5`                                            | Length of each crossfade in seconds.                                                                              |
| `PHOTOS` | `clipA 0.5s, clipB 1.5s, clipA 4.0s, clipB 5.0s` | One line per photo: which clip (0 = clipA, 1 = clipB) and the second its still is taken from, in slideshow order. |

## Without the skill

Don’t want to install the skill? Paste this prompt into Claude Code and Claude writes the command itself.

```
Make a 6 second photo slideshow from clipA.mp4 and clipB.mp4, keeping clipA's size (540x960), 30fps and its audio. The photos are four still frames, in this order: clipA at 0.5s, clipB at 1.5s, clipA at 4.0s and clipB at 5.0s, each filling the whole frame and held completely still (no zoom or pan). Photo 1 shows from 0s; photo 2 crossfades in from 1.5s to 2.0s, photo 3 from 3.0s to 3.5s and photo 4 from 4.5s to 5.0s, each a plain linear 0.5 second dissolve, and photo 4 stays to the end at 6.0s. There is no text, so nothing needs drawing (if you add any, draw it with Pillow, not ffmpeg's drawtext). Keep clipA's audio unchanged under the whole slideshow. Use ffmpeg and save it as output.mp4 (H.264, yuv420p).
```

## Run it without Claude

This is the exact command we tested. Save it as `photo-slideshow.sh` and run:

```
sh photo-slideshow.sh clipA.mp4 clipB.mp4 output.mp4
```

```
#!/bin/sh
# Photo slideshow: four stills from two clips, each held still, crossfading into the next every 1.5s.
# Usage: sh photo-slideshow.sh clipA.mp4 clipB.mp4 output.mp4  (clipA's sound plays under the slideshow)
set -e
A="$1"; B="$2"; OUT="$3"
HOLD=1.5   # seconds between one photo and the next starting to fade in
FADE=0.5   # length of each crossfade in seconds
# one photo per line: clip (0 = clipA, 1 = clipB) and the second its still is taken from
PHOTOS="0 0.5
1 1.5
0 4.0
1 5.0"

SIZE=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$A")
LEN=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$A")
W=${SIZE%x*}; H=${SIZE#*x}
FRAMES=$(echo "($HOLD + $FADE) * 30 / 1" | bc)   # each photo lasts its hold plus the fade out of it
GRAPH=""; PREV=""; N=0
while read CLIP T; do
  # each photo: one frame at T, fitted to A's size and repeated so it stands still
  GRAPH="$GRAPH[$CLIP:v]fps=30,trim=start=$T,setpts=PTS-STARTPTS,trim=end_frame=1,\
scale=$W:$H:force_original_aspect_ratio=increase,crop=$W:$H,setsar=1,format=yuv420p,\
loop=loop=$((FRAMES - 1)):size=1,setpts=N/30/TB[p$N];"
  if [ $N -eq 0 ]; then
    PREV="[p0]"
  else
    # photo N starts fading in N x HOLD seconds into the slideshow
    GRAPH="$GRAPH$PREV[p$N]xfade=transition=fade:duration=$FADE:offset=$(echo "$N * $HOLD" | bc)[x$N];"
    PREV="[x$N]"
  fi
  N=$((N + 1))
done <<PHOTOLIST
$PHOTOS
PHOTOLIST
ffmpeg -y -i "$A" -i "$B" -filter_complex "${GRAPH%;}" -map "$PREV" -map 0:a -t "$LEN" \
  -c:v libx264 -crf 18 -pix_fmt yuv420p -r 30 -c:a copy "$OUT"
```

## More layouts and reframing

- [Background replacement **Background replacement**](https://www.recharm.com/effects/background-replacement)
- [Binocular view **Binocular view**](https://www.recharm.com/effects/binocular-view)
- [Blur region **Blur region**](https://www.recharm.com/effects/blur-region)
- [Cinematic bars **Cinematic bars**](https://www.recharm.com/effects/cinematic-bars)
- [Comic panel layout **Comic panel layout**](https://www.recharm.com/effects/comic-panel-layout)

## Find 3x _winning ads_

Recharm cuts your ad footage into tagged, searchable clips: hooks, testimonials, product shots. Find the shots that win, add the effect with Claude, and ship 3x more ad edits.

[Start 14-day free trial](https://www.recharm.com/get-started)
