DEV Community

Javid Jamae
Javid Jamae

Posted on • Originally published at ffmpeg-micro.com

Does n8n Cloud Support FFmpeg? How to Process Video Anyway

Originally published at ffmpeg-micro.com.

You opened an n8n Cloud workflow, dropped in an Execute Command node, typed ffmpeg -i input.mp4 output.webm, and nothing happened. The binary isn't there.

So: does n8n Cloud support FFmpeg? No. Not natively, not with a hack, not with some hidden setting. The hosted n8n environment doesn't ship FFmpeg, and you can't install it.

That's the bad news. The good news is you don't need FFmpeg installed to process video in your n8n workflow. You just need to stop thinking of FFmpeg as a command line tool and start thinking of it as an API call. That switch changes everything.

Why n8n Cloud Doesn't Ship FFmpeg

n8n Cloud runs workflows in a sandboxed environment. You get JavaScript and Python in Code nodes, plus the built-in integrations. You do not get shell access, system packages, or the Execute Command node. The docs are explicit about this.

FFmpeg is a 100MB+ binary with dozens of codec dependencies. Shipping it to every cloud workflow container would balloon the platform, create security headaches, and leave n8n on the hook for every codec CVE. Not happening.

Self-hosted n8n is different. You can apt install ffmpeg on your own server and run it through Execute Command. But then you're babysitting a video processing server, managing scaling, and debugging H.265 edge cases at 2am. Most teams that started there have moved off.

The Workaround: Treat FFmpeg Like Stripe

Think about how you handle Stripe. You don't install Stripe in your workflow. You call Stripe's API with an HTTP Request node. Same idea with FFmpeg.

FFmpeg Micro runs FFmpeg in the cloud and exposes it as REST. Upload a video, tell it what to do, get a processed video back. Three endpoints, and you're already using the HTTP Request node for everything else, so there's nothing new to learn in n8n.

The flow looks like this:

  1. Get a presigned upload URL
  2. PUT your video to that URL
  3. Confirm the upload
  4. Create a transcode job
  5. Poll until it finishes
  6. Download the result

Every step is an HTTP Request node. No binary data gymnastics, no Code nodes wrangling buffers, no temp files.

Setting It Up in n8n Cloud

Sign up at ffmpeg-micro.com and grab your API key from the dashboard. Save it as a Header Auth credential in n8n:

  • Name: Authorization
  • Value: Bearer YOUR_API_KEY

Every HTTP Request node in your video workflow will use this credential. Now you're ready to build.

A Real Workflow: Resize a Video for Instagram

Say a new video lands in your Google Drive and you want to resize it to 1080p vertical for Instagram Reels. This is the full workflow.

Step 1: Request an Upload URL

HTTP Request node, POST to https://api.ffmpeg-micro.com/v1/upload/presigned-url with this body:

{
  "filename": "{{ $json.filename }}",
  "contentType": "video/mp4",
  "fileSize": {{ $json.fileSize }}
}
Enter fullscreen mode Exit fullscreen mode

Response gives you an uploadUrl and an uploadId. The URL is good for a few minutes.

Step 2: PUT the Video to That URL

Another HTTP Request node. PUT the file to the uploadUrl from step 1. No auth header needed on this one since the URL is already signed. Set the request body to the binary video data and the Content-Type to match what you declared.

This is the only step that moves binary data through n8n. If your video comes from a previous node (Google Drive, Dropbox, S3), n8n passes it through as binary.

Step 3: Confirm the Upload

POST to https://api.ffmpeg-micro.com/v1/upload/confirm:

{
  "filename": "{{ $json.filename }}",
  "fileSize": {{ $json.fileSize }}
}
Enter fullscreen mode Exit fullscreen mode

Response includes a fileUrl in the format gs://.... That's what you feed into the transcode job.

Step 4: Create the Transcode Job

POST to https://api.ffmpeg-micro.com/v1/transcodes:

{
  "inputs": [{ "url": "{{ $json.fileUrl }}" }],
  "outputFormat": "mp4",
  "preset": {
    "quality": "high",
    "resolution": "1080p"
  }
}
Enter fullscreen mode Exit fullscreen mode

That's the simple mode. Quality is low, medium, or high. Resolution is 480p, 720p, 1080p, or 4k. Response includes an id. That's your job ID.

Want full control? Drop the preset and pass raw FFmpeg options:

{
  "inputs": [{ "url": "{{ $json.fileUrl }}" }],
  "outputFormat": "mp4",
  "options": [
    { "option": "-c:v", "argument": "libx264" },
    { "option": "-crf", "argument": "20" },
    { "option": "-vf", "argument": "scale=1080:1920" }
  ]
}
Enter fullscreen mode Exit fullscreen mode

That's the escape hatch. Anything you can do on the command line, you can do here.

Step 5: Poll for Completion

Video processing isn't instant. Use an n8n Wait node (10 seconds) followed by an HTTP Request node that GETs https://api.ffmpeg-micro.com/v1/transcodes/{{ $json.id }}. Check the status field. If it's processing or pending, loop back to the Wait node. If it's completed, move on. If it's failed, branch to an error handler.

n8n has a loop pattern for this: IF node checks status, and the "not completed" branch goes back to the Wait node. Five lines of visual workflow.

Step 6: Download the Result

Once status is completed, GET https://api.ffmpeg-micro.com/v1/transcodes/{{ $json.id }}/download. You get a signed URL pointing at the finished video. Hand it off to whatever comes next: upload to YouTube, save back to Drive, send a Slack notification with the link.

Batch Processing

Same pattern works for batch jobs. Trigger the workflow on a schedule, loop through a folder of videos, and run each one through the six-step flow. Because FFmpeg Micro runs jobs in parallel on its end, kicking off ten transcodes simultaneously doesn't slow anything down. You pay per minute of video processed, not per server hour, so idle costs are zero.

What This Replaces

Before this pattern, teams running video workflows on n8n Cloud had three options: move to self-hosted n8n and install FFmpeg, pay a per-video SaaS like Rendi or Cloudinary, or stitch together a custom AWS Lambda + FFmpeg layer. All three add ops overhead or vendor lock-in.

The HTTP-calls-to-FFmpeg-Micro pattern keeps your workflow in n8n, keeps costs tied to actual usage, and gives you the full FFmpeg surface area when you need it. Your designer doesn't need to learn -filter_complex, and you don't need to touch a server.

Sign up for a free account and paste your API key into n8n. You'll have your first automated transcode running before lunch.

Top comments (0)