A photo video that cuts on the beat is a timing problem before it is a design problem: how long each photo stays is decided by the music, and how long each line of text stays is decided by the photo under it. This article builds one in CapCut's web editor at 16:9, four beach photos of the same man over a library track, with one line of original text per photo, and measures the result on the exported file: where the cuts landed against the beats, and where the captions came and went. The music's tempo was not displayed anywhere in the editor, so the first job was to find it.
Measure the beat from an export, not from a label
The Audio panel's Music tab lists tracks with a duration and a credit line, "Sunrise, 00:31, BCD Studio" in this case, and no tempo. In the web-editor session used here, this library track displayed neither a tempo value nor beat markers. The way to get the number is to lay the track on the timeline, export once, and read the tempo off the exported audio. The reading was done here with a short script that measures how much the music's onset pattern repeats itself at each time lag, which is the same thing a tap-tempo tool does by hand.
Self-similarity of the track against lag. The two loudest repeats are 0.45 and 0.75 seconds apart, which is not a tempo; together they make 1.20 seconds, half a bar at 100 BPM.
The first automatic estimate said 133 BPM, with 80 BPM close behind, and neither is right. The track is syncopated: its strongest repeating figure is a pair of gaps, 0.45 seconds then 0.75, that add up to 1.20 seconds, and 1.20 seconds is half a bar of four beats at 100 BPM. Once the tempo is 100, the beat is 0.60 seconds and a bar is 2.40, and the dwell time for each photo follows from the planning rule, 60 divided by BPM times the number of beats: two bars, eight beats, 4.80 seconds. Four photos at 4.80 seconds fit the 19-second usable length of the track with the last one ending at 19.17 seconds. The lesson is not the number, which belongs to this track; it is that a tempo estimate has to be checked against the bar length, because a syncopated track will hand you a plausible wrong answer first.
Seek two frames early, because the split lands late
The photos were dropped onto an empty timeline as four files at once and arrived in order at five seconds each. Each was then shortened to 4.80 seconds by the split: move the playhead to the cut time, click the photo, press the Split icon at the left of the timeline toolbar, click the tail, press Delete, and the following photos slide left. With the beat grid measured from the export, the cut times were the downbeats: 4.77, 9.57, 14.37 and 19.17 seconds, the music having started at frame 5 of the timeline because the ruler would not seek closer to zero than that.
The first export measured every cut at 73 milliseconds after its beat, which is 2.2 frames at 30 frames per second, and the same amount on all three. The playhead had read the intended frame each time. In this editor, in this session, a split placed with the playhead on frame N made the new clip start on frame N plus 2 in the export. So the project was rebuilt with each playhead position set two frames before the beat, and the cuts came back at 4.767, 9.567 and 14.367 seconds against beats at 4.760, 9.560 and 14.360: 7 milliseconds, a fifth of a frame.
The first cut frame by frame. The beat falls at 4.760 seconds, between frames 142 and 143; photo 2 and its caption start on frame 143.
Half a beat at 100 BPM is 300 milliseconds, nine frames; that is the drift the planning row warns will make a whole video feel loose. Two frames was the repeatable offset observed in this project; verify the timing with a test export instead of assuming the same offset in another project. The check is cheap: export, extract the audio, mark the beats, mark the frames where the picture changes, and read the differences. On this export all three differences are 7 milliseconds.
One line per photo, handed over on the cut
The plan called for each line to enter four frames before its cut and leave six frames after the next, and that was built and exported first. It does not work on a single caption position: for ten frames at each cut two lines occupy the same place in the lower third, and neither can be read. On the single text track used here, extending one caption pushed the next caption later; overlapping captions would require separate text layers or tracks. The version kept here hands over on the cut instead: each caption starts on the first frame of its photo and ends on the last, and all four sit on one text track, end to end.
The finished video, 1280 by 720, 30 frames per second, 19.03 seconds, as exported. Turn the sound on for the track. Shown here as frames in sequence; the full video and a GIF version are supplied alongside this document.
The video in nine frames. Four photos, four lines, and a cut every 4.80 seconds.
Each caption was made with Add heading in the Text panel with the playhead on its cut, then edited in the Basic panel. Three settings did the work: the font, Playfair Display Regular, chosen from a dropdown of 239 fonts; the size, 8, after 28 ran off both edges of the frame; and Transform, Position Y at minus 230, which drops the line into the lower third. A new heading arrives at three seconds long, so each was stretched to its photo by dragging its right edge; the handle is found by moving the pointer along the clip's end until the cursor changes to the resize arrows, one or two pixels inside the end.
The timeline at the end of the build, and the two fields that set the caption's look: font and size in the Basic panel, with Position Y set further down the same panel.
Keep the line off the face
The planning rule for text placement was written for a vertical frame, 15 percent clear at top and bottom and a ring around the face. At 16:9 the frame is wide and short, so the rule becomes a band: the captions here occupy the bottom 34 to 39 percent of the height, centered, and every face in the four photos sits in the top half, so nothing needed moving. What the band does not solve is contrast. Over the sand and the sky the thin white serif reads cleanly; over the sea foam in photos 2 and 3 it loses its edges.
The caption band against the faces, and the same caption style over sand and over foam. Position keeps the line off the face; contrast is a separate decision.
The Basic panel offers Stroke, Background and Shadow under Style for exactly that; they were left off here so the measurement of the plain line would be honest, and a shadow is the first thing to add on a bright, busy photo.
The handwritten look, and why it is not here
The planned title promised handwritten captions. The web editor's font dropdown lists 239 fonts in this session; the Latin ones run from Playfair Display and Lora to Poppins, Oswald and Bebas Neue, and none of them is a script or handwriting face. The Text templates panel has collections labeled Trending, Classic and Hits, plus several named after third-party properties; the ones that look hand-lettered are in those branded collections and most carry a gem badge, and the Text effects tab's "Manuscript" category turned out to be paper-cut and sticker treatments of block letters. So the captions here are a serif, and the title has dropped the word. If no suitable handwriting font is available, import a custom font when that option is available, or use the lettering as an image layer.
What was spent, and what was not
The four photos were generated in Video Studio's Image mode on 8 September 2026, one from a text description through the CapCut AI image generator flow and three from that photo with the same man and clothes in new poses, so the set holds one person; before each request the chat printed "Generating 1 item will consume 1 credit" at Seedream 4.5, 16:9 and 2K, and that line is the only credit figure used here; other models, resolutions and modes are priced differently. Everything after that, the music, the cuts, the captions and more than a dozen exports at 720p, showed no credit line in the editor in this session.
The cost line before the first photo and before one of the three variants, 1 credit each at Image mode, Seedream 4.5, 16:9 and 2K.
The next video to make is the one you already have photos for: put the track on the timeline, export once and read its tempo, decide beats per photo, seek two frames early and split, and then export again and measure before you write a single caption. The lines here are four sentences written for this article, not lyrics; a library track's lyrics, if it has any, and any published song's words are not yours to overlay. What this article does not cover: photography, color grading, vertical export, and watermark removal.
Written 8 September 2026. The man in the photos does not exist; all four photos are generated images from CapCut made for this article. Interface labels, panel contents, font and template lists, and export settings reflect a single session on that date and may change. Beat and cut times were measured on the exported files: beats from the audio's onset pattern, cuts from frame-to-frame change, both at 30 frames per second.