Skip to content
Get in touch

Assemble your story into a movie

Turn pictures, narration and chosen clips into a movie. Try a tested FFmpeg recipe, watch your first cut, and revise its timing.

Go to My experiment

Explore

What are the ways to do this?

Watch · Assemble · Revise

Six pictures. One story. Your timing.

Story Studio gives you a story, picture choices and a sound plan. Here, make those choices into a movie you can watch, keep and change.

FFmpeg is a media tool that runs on your computer. It converts, cuts and combines files; it does not invent your story or choose its pacing. An AI assistant can help translate your decisions into commands. You decide whether the result works.

First cut — the repairer

Six still pictures follow unequal passage timings, with about four seconds of final-picture hold.

Credit: Story and direction: Renaissance Solutions. Artwork created with OpenAI; existing Speechify George narration and project-synthesized sound cues. See the retained credit record. Credit details

Second cut — one later picture change

Picture two arrives one second later; narration, picture three and total duration stay in place.

Credit: Story and direction: Renaissance Solutions. Artwork created with OpenAI; existing Speechify George narration and project-synthesized sound cues. See the retained credit record. Credit details

Read the transcript and sound descriptions · Download captions · Source credits

Start with the complete example

Download the movie example package. It contains six pictures, finished narration, timing sheets, readable filter files, commands, captions, credits, practice clips and reference movies. Extract it into a new folder before running anything.

Download a timing sheet · Download all commands

1. Get ready

A terminal is a place to type instructions. A command names a tool, its inputs, and what to produce. Run one command at a time; wait until the prompt returns. Long commands below are still one line.

Install and check on macOS

Open Terminal from Applications → Utilities. If Homebrew is already installed, run brew install ffmpeg. Otherwise use the FFmpeg download page or the Homebrew installation guide to choose an installer for your Mac. FFmpeg links to third-party compiled builds; you do not need to compile its source.

Open a new Terminal window and run ffmpeg -version, then ffprobe -version. Both should print version information. Type cd with a trailing space, drag your extracted example folder into Terminal, then press Return. Run pwd and ls to confirm that you see the pictures and narration.

Install and check on Windows

Use a Windows build linked from the FFmpeg download page. Extract it into a stable folder such as C:\Tools\ffmpeg; locate the bin folder containing ffmpeg.exe and ffprobe.exe. Add that bin folder to your user Path in “Edit environment variables for your account,” then open a new PowerShell window.

Run ffmpeg -version and ffprobe -version. In File Explorer, open your extracted example folder, type powershell in its address bar, and press Enter. Run Get-Location and Get-ChildItem to check the folder. The one-line commands below use double quotes and work as PowerShell syntax. Native Windows execution has not been tested.

Run ffprobe -v error -show_streams -show_format narration.mp3. Look for codec_type=audio, duration, sample rate and channels. Inspect a video the same way to see its picture dimensions, frame rate and audio streams. A filename extension alone does not tell you which streams it contains.

The example folder holds picture-01.webp through picture-06.webp, narration.mp3, the two .filter.txt files, and supporting text files. Reference outputs are in reference/; your new outputs appear beside the inputs. Keep real extensions: renaming a PNG to JPG does not convert it.

Protect the originals: every export uses -n, which refuses to replace an existing file. For another attempt, change only the output name. Quote paths containing spaces, for example "my narration.mp3". FFmpeg works locally; an external AI service has its own file-handling rules. You can ask for help using filenames and ffprobe details without uploading media.

2. Make your first movie

Listen for the start of each passage and note its time. Subtract one picture’s start from the next to get its duration. For example, the second picture starts at 11.500 seconds and the third at 18.638, so picture two lasts 7.138 seconds. Equal picture durations would lose this relationship.

The filter file fits each image inside a 1920 × 1080 canvas with padding, keeps it still, and joins the six segments. Its end_frame values express duration in 30 fps frames. The command adds the finished narration and keeps the final picture until about four seconds after the audio ends.

Make the first cut

56.800 seconds; six still pictures, finished narration and about four seconds of ending silence. Image boundaries are rounded to the nearest 30 fps frame.

Expected file: first-cut.mp4. Keep every input file.

The workshop and bird cues are already in this narration. Preserve that mix: do not add those effects again.

3. Revise one timing decision

The second version holds picture one for one more second and shortens picture two by the same amount. Picture three still starts at 18.638 seconds; the soundtrack and total duration stay in place. Watch around 11–13 seconds in both versions.

Move picture two one second later

56.800 seconds; six still pictures, finished narration and about four seconds of ending silence. Image boundaries are rounded to the nearest 30 fps frame.

Expected file: revised.mp4. Keep every input file.

Apply the timing sheet to your own story

Keep an unchanged copy of the example. Give your assistant your filenames, measured passage starts, finished audio duration and the downloaded timing sheet. Ask it to propose updated filter values and a new output name, then approve the timing yourself.

At 30 fps, calculate each cumulative change time × 30 and round to the nearest frame. Subtract adjacent frame positions for each segment’s end_frame; this avoids accumulating rounding error. Set the final frame position to the narration duration plus about four seconds, rounded up. The command’s -t value is the total frame count divided by 30.

For more or fewer pictures, update the inputs, filter labels and concat count together. If an assistant cannot inspect or align your audio, it must say so; listen and supply the times. Recheck caption text and timing whenever narration changes.

4. Combine clips · Optional

The package includes two short pan-and-zoom practice clips made locally from the story pictures. They have different dimensions and frame rates; one has no audio, the other has a quiet tone. They demonstrate editing mechanics, not new story scenes.

First trim each clip and make their dimensions, frame rate and audio layout agree. The first command mutes original sound and supplies silence. The second retains its original audio. Use the timing sheet to make that choice for your own clips.

Trim a video and mute its original sound

Three seconds, padded to 1080p, with a silent audio track. Adding silence makes later joins predictable.

Expected file: clip-a.mp4. Keep every input file.

Trim another video and retain its sound

Three seconds of portrait video with side padding and its quiet practice tone retained.

Expected file: clip-b.mp4. Keep every input file.

Join the normalized clips

Six seconds: the cut is at three seconds. This re-encodes for consistent output; arbitrary camera clips are not safe to join with stream copy.

Expected file: joined-clips.mp4. Keep every input file.

Turn a picture into a short silent clip

Two seconds, including a silent audio track.

Expected file: still-clip.mp4. Keep every input file.

Combine still and moving clips

Eight seconds: a still picture followed by the two practice clips.

Expected file: mixed.mp4. Keep every input file.

Copy or re-encode? Stream copying (-c copy) avoids re-encoding, but joining requires matching codecs, stream layouts and time bases. Cuts may be limited by keyframes. These joining recipes re-encode normalized clips for consistent boundaries; use copying only after inspecting compatibility. The caption recipe below shows a safe copy of an already finished picture and soundtrack.

5. Place sound · Optional

Think of narration, music, original clip sound and effects as separate layers. Write down when each starts, how long it lasts, and its level. A sound may start before a cut or continue after it. A quiet moment can work without another effect.

Trim and assemble six narration takes

These practice commands cut six excerpts from the supplied finished recording, then join them in story order. Run all six trim commands before the join. With your own recordings, choose the takes and trim their boundaries first. These commands preserve sample rate/channel compatibility by converting to 48 kHz stereo WAV.

Trim practice take 1

A practice excerpt from the existing finished mix. Your own takes can be separate recordings; retain the originals.

Expected file: take-01.wav. Keep every input file.

Trim practice take 2

A practice excerpt from the existing finished mix. Your own takes can be separate recordings; retain the originals.

Expected file: take-02.wav. Keep every input file.

Trim practice take 3

A practice excerpt from the existing finished mix. Your own takes can be separate recordings; retain the originals.

Expected file: take-03.wav. Keep every input file.

Trim practice take 4

A practice excerpt from the existing finished mix. Your own takes can be separate recordings; retain the originals.

Expected file: take-04.wav. Keep every input file.

Trim practice take 5

A practice excerpt from the existing finished mix. Your own takes can be separate recordings; retain the originals.

Expected file: take-05.wav. Keep every input file.

Trim practice take 6

A practice excerpt from the existing finished mix. Your own takes can be separate recordings; retain the originals.

Expected file: take-06.wav. Keep every input file.

Join six chosen takes in order

The six practice WAV takes reassembled. Use the completed listening copy as the input to your picture sequence; do not add its existing effects again.

Expected file: joined-takes.wav. Keep every input file.

First complete “Trim a video,” “Trim another video,” and “Join the normalized clips” above to create joined-clips.mp4. The sound exercise uses a quiet synthetic bed and a one-second cue. The cue starts at 2.5 seconds and crosses the cut at 3 seconds. Replace these practice tones with your own permitted music or effects when telling your story.

Place a quiet bed and a cue across a cut

The cue begins at 2.5 seconds and lasts one second, crossing the cut at 3 seconds. Bed and clip sound stay separate until this export. These are synthetic practice tones, not a music recommendation.

Expected file: sound-across-cut.mp4. Keep every input file.

Sound description: a soft low tone under two clips; a higher cue crosses the cut at three seconds. No speech. Download the sound exercise.

For the narration comparison, first run “Trim practice take 1” in the six-takes section to create take-01.wav.

Try a bed under one narration excerpt

The six-second bed ends before the narration; every word should remain clear. Listen and lower the bed further if needed. This is an optional comparison, not an instruction to remix the finished Story Studio narration.

Expected file: speech-with-bed.wav. Keep every input file.

Listen to the narration excerpt with and without the bed. Keep every word clear. The example gain values are starting points, not universal loudness settings; lower a layer if it distracts. Keep separate sources so the mix can be revised.

6. Review, export and keep a copy

Watch from beginning to end with sound on. Check picture changes, speech clarity, clipped tails, silent gaps, captions and the final hold. Open the exported file in another player or on the intended device. A successful command is only the first check.

Keep selectable captions inside the movie

Video and audio are copied unchanged. Switch captions on in a supporting player; keep the SRT and transcript for players without subtitle support.

Expected file: story-captioned.mp4. Keep every input file.

Extract a listening copy

A WAV audio file, including the ending silence; the movie is unchanged.

Expected file: listening-copy.wav. Keep every input file.

Export a smaller viewing copy

A 720p derivative. Keep the 1080p export and originals.

Expected file: viewing-720p.mp4. Keep every input file.

The captioned MP4 carries selectable subtitles, including ending credits. Keep the separate SRT, VTT and transcript too: subtitle support varies between players. Review passage-aligned caption timing and readability for your audience. Retain CREDITS.txt and check permissions before sharing beyond the lesson.

Your editable project here is the source media, filter files, commands and timing sheet. Keep the first cut, final export, original takes, captions, credit record and revision notes together.

If a command does not work
“Command not found” or “not recognized”
Check installation and Path, then reopen Terminal or PowerShell. Test both ffmpeg and ffprobe.
“No such file” or “Error opening input”
Check your current folder, the exact filename and extension. Extract the ZIP first. Put paths with spaces inside straight double quotes.
Output already exists
-n is protecting your previous take. Choose a new output filename.
Incompatible media or missing streams
Inspect with ffprobe. A silent clip has no audio stream to map; use the supplied silence approach. Normalize dimensions, frame rates, sample rates and channel layouts before joining.
Stretched or cropped pictures
Keep both aspect-preserving scale and pad, plus square pixels (setsar=1). Black bars are preferable to distortion; choose another framing deliberately if needed.
Audio ends too early
Compare its duration with the timing sheet. An unexpectedly short recording is not repaired by silence: supply the complete recording or revise the sequence. Avoid adding -shortest, which can remove the ending hold.
Unknown encoder “libx264”
Use a build that includes H.264 encoding, then check ffmpeg -encoders. Do not simply change the output extension.

Approach map

Open any approach to inspect its starting material, human work, outputs, and sequence.

Use a timing sheet and a local recipeDirect the edit in plain language, then run FFmpeg on your computer.
Starts with
Your files and credits · A finished narration · Picture-change times
Main actions
Inspect the files · Approve the timing · Render a first cut · Watch and revise
Outputs
Playable movie · Editable commands and timing sheet · Captions and credits
Human work
Choose the story and media · Approve suggested timing · Listen and watch · Keep source permissions
Useful when
You want repeatable edits · An AI assistant can help adapt the commands
  1. Gather and inspectKeep originals and identify what each file contains.
  2. Set the timingDecide what appears and what is heard at each moment.
  3. Render and reviewChange one thing and compare with your first cut.

Start with your intention

Use My experiment to note your audience, material, limits, equipment, and sharing restrictions. Every field is optional. “Try with our example” fills only an empty goal and constraints field.

Prompt · version 1

Turn my assembly brief into commands

After gathering your files and narration.

Ask an assistant to translate your choices into a local edit.

Example: Six pictures with unequal durations and a finished sound mix.

Show the full prompt

The published prompt stays unchanged.

Decide

What matters for your project?

Use a few criteria and a separate must-have list. An unknown must-have remains unresolved.

Must-have

Pictures follow meaning

Each change supports its passage; timings can be unequal.

Acceptable: You can explain and revise each picture change.

Must-have

Every word is clear

Music and effects support the narration without duplicating its existing mix.

Acceptable: Listen from beginning to end and lower distracting layers.

Must-have

Keep an editable record

Retain originals, timing sheet, commands, captions and credits.

Acceptable: A second cut can be made without replacing the first.

AI reported

What an AI response says. Follow the sources before relying on it.

Source checked

What an opened source states. This does not prove product performance.

We tested

What RS observed in a dated, bounded trial.

Still uncertain

What is unknown, unverified, or outside the trial.

Prompt · version 1

Revise one edit without losing the first cut

After watching the first cut.

Describe what you saw or heard, then make one traceable change.

Example: A picture arrives early, or a sound masks one word.

Show the full prompt

The published prompt stays unchanged.

Experiment

Move one picture change

Compare a first cut with one deliberate timing revision.

Ready-to-use brief

Make the repairer movie, then move the second picture from 11.5 to 12.5 seconds while keeping the third picture and the soundtrack in place.

Input

Download the example package. Use its six pictures, narration, first-cut.filter.txt and revised.filter.txt.

Limit

No account, paid generation or upload is required. Allow time for installation and rendering.

Path 1

Watch first-cut.mp4 with picture two starting at 11.5 seconds.

Path 2

Watch revised.mp4 with picture two starting one second later.

Only one candidate? Compare the provided reference movies before installing anything.

Define success before you begin

  1. Watch the reference movie.
  2. Make a first cut using the supplied command.
  3. Change only the second picture boundary.
  4. Watch both versions and record your preference and reason.
  5. Keep both outputs and the timing sheet.

Observation questions

  • Which picture change feels better with the words?
  • Did the rest of the sequence and the sound stay in place?
  • Does the ending have time to settle?

What would you do next? Continue, change an approach, check a claim, try a simpler method, or stop.