Assembling clips + voiceover + SRT captions into one MP4 on n8n Cloud (no Execute Command node)

On n8n Cloud there’s no Execute Command node, so the usual “run FFmpeg” answer doesn’t work. Here’s the pattern I use for the final assembly step of a short-video pipeline.

Pipeline

  1. Script → clips (stock, AI video, your own) → narration audio (TTS or recorded) → SRT captions with timings
  2. Assembly step: send the public URLs + SRT text to an API that scales/crops every clip to one frame size, concatenates them, lays the narration under them and burns in the captions
  3. Upload or post the MP4

Things that bit me while building the example

  • Stock/agency footage often starts with a title slate or has letterbox bars baked in. Pick clean clips or trim them first.
  • Some hosts (Wikimedia, for example) block requests without a proper User-Agent, so make sure whatever fetches your media sends one.
  • Time captions against the recorded audio, not the script. Pauses differ.

Example result (48 s vertical: 4 public-domain NASA clips, a phone-recorded voiceover, 15 caption lines that I timed by hand): https://api.apify.com/v2/key-value-stores/emG7BAVjOvP3fYfJM/records/output.mp4?signature=1mYE9lM2e7CwzRfisNM7S

Scope: Up to 10 clips and 60 seconds of output. Original clip audio is discarded; supply a separate soundtrack or the output is silent. You supply caption timing. No per-clip trimming or automatic transcription. Download/save the returned MP4 within your Apify storage retention period.

Options for the assembly step

Disclosure: I built the Apify Actor and it’s paid ($0.20 per finished video; failed renders incur no video-assembly charge; the demo is free).

Quick setup clarification: the unchanged template returns a cached demo. To assemble your own video, you need to replace the empty clips list.

Narrated setup guide (1:47): https://youtu.be/l1pk2BPfYC8 — covers the credential, demo versus real input, billing and saving the MP4. Uses a synthetic narrator; the Actor does not generate voices or caption timings.

From demo to a real render

  1. Import the template linked above and select your Apify Header Auth credential in Assemble video on Apify.
  2. Run once with clips: [] to check the connection. In that node’s output, demo: true and charged: false identify the demo.
  3. For a real render, replace the JSON in Set video job with your public clip URLs, or use the copyable eight-second NASA example now included in the template description. The sample has supplied caption timings and no narration; it is intentionally silent.
  4. Review the $0.20 per successfully assembled video price before executing. In the HTTP node’s output, demo: false identifies your media job and charged reports whether the charge went through. The final node currently selects only the URL, duration and status.
  5. Save the MP4 to your own storage promptly; the output link is not permanent.

Fit check: up to 10 clips and 60 seconds of output, 200 MB per file and 600 MB total downloads. Original clip audio is discarded. You supply narration and caption timing; there is no automatic transcription or per-clip trimming. If a request times out, check Apify Runs before retrying because the original render may still be running.

Disclosure: I built this paid Actor. Failed renders incur no video-assembly charge. The demo has no video-assembly charge; compute is still incurred by the operator.

If you try it and get stuck, share the failing step and error message here, with tokens and private media links removed. That will help me distinguish setup issues from rendering failures.

rendering dynamic video assemblies on cloud runtimes without access to local shell binaries requires offloading transcoding tasks to dedicated media processing microservices. sending render specifications as json manifests keeps the n8n execution environment lightweight and responsive.

using external render apis with webhook completion callbacks ensures long-running ffmpeg encodes never exceed workflow execution timeouts.

Thanks, Long. We offload the assembly to Apify; the published starter workflow currently waits for the result. Your point about completion callbacks is useful for longer jobs.

Are you running a video workflow yourself, and have you encountered timeouts with that approach?