How to Render and QA a Vertical TikTok Product Video
Reproduce Scott’s Day 4 demo locally and check a 1080 × 1920 product MP4, 10 timed captions, and five cuts before delivery.
Scott’s Day 4 open-source demo turns six synthetic clips and prerecorded narration into a vertical product MP4. The reproduced file has 1080 × 1920 H.264 video at 30 fps and an AAC audio track. This walkthrough shows where to find the video, how to check its 10 captions and five cuts, and which checks still need a human reviewer. Day 4 video walkthrough, in Mandarin · Pinned source
How do you render the product video locally?
Use Git, Node.js 22 or later, FFmpeg and FFprobe, Python 3 with Pillow, and Chrome for HyperFrames. The initial dependency install needs internet access. The default demo uses a fictional Aurora Tumbler, synthetic footage, preassigned shot labels, and prerecorded narration. It needs no model API key or voice service. Demo setup · SCTCamp project resource, in Chinese
git clone https://github.com/scotti1i/commerce-video-edit-automation-day04.git
cd commerce-video-edit-automation-day04
git switch --detach e5ddc3454dbb085a00145bba948ab27130adc5fa
npm ci --ignore-scripts
npm run demo
This run used FFmpeg 9.0.1. The pinned commit reads the FFmpeg version and uses -/filter_complex on version 7 and later. It uses the original file option for recognized older releases. If an older checkout reports Unrecognized option 'filter_complex_script', check its commit against the one above. FFmpeg option change · Project compatibility code
Which files should you check?
| File | What the reproduced output shows |
|---|---|
jobs/demo/data/assembly-edl.json | The edit decision list has six segments spanning 0–23.278 seconds. sourceStart and sourceEnd select the source range. timelineStart and timelineEnd locate it in the assembled timeline. |
jobs/demo/data/captions.json | Ten caption cues. s and e give the start and end in seconds, and t gives the text. The demo derives timings from the prerecorded narration’s word timestamps. |
jobs/demo/qa/seams/report.json | Five cuts with status review_required. Inspect the neighboring seam-*.jpg files for abrupt cuts, flash frames, and product cropping. |
jobs/demo/variants/douyin-vertical/renders/demo-vertical.mp4 | The final vertical MP4 rendered by HyperFrames with captions drawn into the picture. |
The first cut lands at 3.428 seconds. Caption one runs from 0.096 through 3.198 seconds, and caption two starts at 3.524. All ten cues stayed within their own segments without overlapping. The final cue, a single Chinese character, appears from 23.059 to 23.198 seconds, about 0.14 seconds. A cue can fit its scene and still be too short to read. For a product video, try merging a fragment like this into the preceding cue, then play it back to check readability. Caption generation script
How do you verify the final MP4?
Run these commands from the project directory.
video=jobs/demo/variants/douyin-vertical/renders/demo-vertical.mp4
ffprobe -v error -show_entries \
stream=codec_type,codec_name,width,height,avg_frame_rate,nb_frames:format=duration \
-of json "$video"
npm run qa -- --job jobs/demo --video "$video" --fps 30/1
FFprobe reported 702 frames, a 30/1 frame rate, 1080 × 1920 H.264 video, and AAC audio. The video track lasts 23.4 seconds and the MP4 container duration is about 23.42 seconds. The QA command generated nine sample frames. In jobs/demo/qa/report.json, failures was [] and the status was review_required. Final QA script
The public report records the measured video format, caption timings, and review status for the synthetic sample. Download the QA JSON
Before delivery, inspect the sample frames and five cut images, then play the video from start to finish on a phone. Check that the opening clearly shows the product, the captions leave room for the app interface and product, the shots support the narration, and the audio plays continuously. Use footage you have permission to use and keep customer, order, or unreleased product details and any corresponding QA frames internal. Day 4 QA checklist · Storyboard and ASS caption demo