
A workflow to copy the reaction shot from a UGC tiktok and cuts it out so I can replicate at scale with AI
Every viral TikTok ad we scroll past in 2026 still uses the same setup. Girl smiles or gasps or rolls her eyes for 2 seconds, then cut to a screen recording of some product. Thats the whole ad. The reaction shot is what stops your thumb.
I wanted to make a bunch of these. Different product, different AI avatar, same reaction style. The reaction shots are the hard part because every tiktok cuts at a different point. yt-dlp gives you the whole video, fine, but every clip needs its own trim. I tried doing 6 by hand and gave up around the 4th.
So the workflow goes form trigger > RenderIO downloadAndProcessMedia (which is FFmpeg-as-a-service with yt-dlp baked in, which is the only reason this is short, otherwise youd need a downloader step before the ffmpeg step). One ffmpeg pass that grabs the video, stream copies it as source.mp4, and dumps every scene change timestamp to scenes.txt using select='gt(scene,0.3)',metadata=print:file=...then a Code node fetches scenes.txt, regexes the first pts_time between 1 and 6 seconds (where reaction shots actually land), and an HTTP Request posts back to RenderIOs /api/v1/run-ffmpeg-command with the trim. Form completion at the end with the download link.
Bit thats interesting if you tried this before: getting the detected cut time out of ffmpeg and back into ffmpeg is way harder than the trim itself. The n8n RenderIO community node has noDataExpression: true on its ffmpeg command field so n8n expressions like {{ $json.hookEndSec }} just dont evaluate. Solution was to skip the node and POST to the RenderIO API directly from a regular HTTP Request node, where jsonBody does evaluate.
The maintainer had already shipped <<alias>> placeholders to unblock the underlying issue ({{}} colliding with n8n expressions), so I used those for <<in_video>> and <<out_hook>>. Still waiting on the community node patch but the API direct route works today.
Here are some examples:
- Video 1 Original: https://renderio.dev/api/media/outputs/iDVm14OORXdfsHs0pNXSF7wlCLeWIeoW/15423c3c-f2cb-4f04-b5f3-4fd687ddcdb6/source.mp4
- Visual V1 hook (trimmed): https://renderio.dev/api/media/outputs/iDVm14OORXdfsHs0pNXSF7wlCLeWIeoW/48fd0e08-aeba-45d7-b3ed-43fa8e8ea566/visual_hook.mp4
- Video 2 Original: https://renderio.dev/api/media/outputs/iDVm14OORXdfsHs0pNXSF7wlCLeWIeoW/eddd7e07-027e-469e-a35b-b4b9e7b4fee2/source.mp4
- Visual V2 hook (trimmed): https://renderio.dev/api/media/outputs/iDVm14OORXdfsHs0pNXSF7wlCLeWIeoW/f9c0730b-1d1d-4475-8c5c-f22c400711a7/visual_hook.mp4
Here is the github link: https://github.com/RenderIO/workflows/blob/main/workflows/tiktok-visual-hook-splitter.json
Last bit, has anyone done image to video motion transfer at scale? I want to wire these reaction clips into my own AI avatar via Kling.