A video processing API takes a video file you already have and converts it: a different format, codec, resolution or bitrate (transcoding, also called encoding), plus jobs such as extracting audio, making thumbnails or burning in subtitles. In October 2026 the main options are AWS Elemental MediaConvert and Coconut, which charge per output minute (from $0.0075), and Rendi and Transloadit, which charge by gigabytes processed. Rendi is a true FFmpeg API: you send an FFmpeg command and it runs it for you.
This guide explains how processing differs from editing, compares the providers (prices checked on each vendor's page on 18 October 2026), weighs FFmpeg as a service against a declarative API and plain self-hosted FFmpeg, and shows the same three jobs both ways: the FFmpeg command and the JSON2Video JSON. It is one of the six kinds of video API.
Video processing vs video editing
| Video processing API | Video editing API | |
|---|---|---|
| You send | A file and the target format, or an FFmpeg command | A description of the finished video: scenes, text, voice-over, captions, music |
| You get | The same video in another format, size or codec; or one or more renditions of it | A new video composed from several assets |
| Typical jobs | Convert MOV to MP4, resize to 720p, compress, extract audio, make HLS or DASH ladders, thumbnails | Product videos, social clips, narrated videos, captioned videos, personalised videos |
| Billed by | Output minutes or gigabytes processed | Seconds of video rendered |
The boundary is blurry because both run on FFmpeg underneath. A useful rule: if the output is the same video in a different shape, you need processing; if it is a new video built from parts, you need editing.
Video processing and transcoding APIs compared
| Provider | What you send | Price | Free tier |
|---|---|---|---|
| AWS Elemental MediaConvert | A job: input file plus output settings (formats, codecs, ladders) | Per normalised output minute. Basic tier $0.0075, Professional tier $0.012 (first tier of each, US East Ohio). HD counts 2×, 4K counts 4× | None stated on the pricing page |
| Coconut | A job: input file plus output formats | Per output minute: SD $0.0075, HD $0.015, UHD $0.03, audio $0.00325 | Test plan: inputs up to 1 minute, one output at a time, no card |
| Rendi | An FFmpeg command and the input file URLs | By data processed (input plus output size). Pro (4 vCPU, 10-minute runtime) $25 a month for 250 GB; $100 a month for 1 TB with unlimited runtime. No charge by codec, duration or resolution | 50 GB a month |
| Transloadit | "Assemblies": steps such as import, encode, thumbnails, export | Lite $29 a month for 15 GB ($2 per extra GB). Pro $54 a month billed yearly ($69 billed monthly) for 40 GB ($1.80 per extra GB) | Community: 5 GB a month, processing stops at the limit |
| Cloudinary | A video URL with transformation parameters | Credits: 1 credit covers 1,000 transformations, 1 GB of storage or 1 GB of image bandwidth. Video delivery counts 2 GB per credit | Free plan: 25 credits a month |
Checked on 18 October 2026. Sources: AWS MediaConvert pricing, Coconut pricing, Rendi pricing, Transloadit pricing, Cloudinary pricing. Prices are in USD. MediaConvert has more tiers and regions than shown. Cloudinary's page gives no separate rate for video transformations, so check its dashboard for real usage.
What the prices mean. Converting 500 minutes of video to a single 1080p rendition costs about $7.50 on MediaConvert Basic (500 × $0.0075 × 2 for HD) and $7.50 on Coconut (500 × $0.015). The data-based plans are cheaper for short, light files and costlier for long, heavy ones, so estimate with your own file sizes before you choose.
Streaming ladders. If you need HLS or DASH with several bitrates (adaptive streaming), use MediaConvert, Coconut, Transloadit or a video hosting API such as Mux that encodes for you. See hosting APIs.
AI agents. JSON2Video has an official MCP server (the @json2video/cli package, started over stdio). Rendi publishes an MCP server for its documentation only. We found no official MCP server for MediaConvert or Coconut (checked 18 October 2026).
FFmpeg as a service vs a declarative API vs self-hosted FFmpeg
All three run FFmpeg or something like it. They differ in what you write and what you maintain.
| Self-hosted FFmpeg | FFmpeg as a service (Rendi) | Declarative API (JSON2Video) | |
|---|---|---|---|
| You write | FFmpeg commands | The same FFmpeg commands, sent by API | JSON describing scenes and elements |
| You run | Servers, queues, scaling, updates | Nothing | Nothing |
| Cost | Software is free; you pay for compute and engineering time | By GB processed | By seconds of video rendered |
| Control | Total: every codec, flag and filter | Total, within the service's FFmpeg build and runtime limits | The options the JSON exposes |
| Best for | Transcoding, compression, batch conversion, anything you already script | Teams with working commands who do not want to host them | Composed videos: scenes, text, voice-over, captions, music, templates |
| Weak spot | Ops work; complex filter graphs are hard to write and debug | Still FFmpeg syntax; you build the composition logic | Not a transcoder; no streaming ladders |
Our honest guidance.
- Pure transcoding or compression of files you already have: run FFmpeg yourself. It is free, and for many jobs one command and a small server are enough. If volume is high or bursty, a managed service such as MediaConvert or Coconut removes the servers.
- You already have FFmpeg commands that work and no wish to host them: FFmpeg as a service (Rendi) is the shortest path. You keep your commands and drop the infrastructure.
- You are building videos, not converting them (scenes, titles, a voice-over, captions, music, the same layout with new data every time): a declarative API is much less code than a filter graph. That is where JSON2Video fits, as an FFmpeg alternative for composition.
New to FFmpeg? Our free FFmpeg course starts with what FFmpeg is and how to install it, and the lesson on FFmpeg wrappers lists libraries for calling it from Python, Node.js, PHP, Java and .NET.
The same job in FFmpeg and in JSON2Video
Three common jobs, each as an FFmpeg command and as a JSON2Video movie. The commands were run with FFmpeg 9.0.1, except the subtitles one (see its note); the JSON passes json2video validate from @json2video/cli. The clips are samples on our CDN, and they have no audio track, which keeps the commands short.
1. Trim and join two clips
Take 5 seconds of one clip starting at second 2, then the first 4 seconds of another, and join them (9 seconds in total).
FFmpeg
ffmpeg \
-ss 2 -t 5 -i beach-01.mp4 \
-t 4 -i new-york-01.mp4 \
-filter_complex "[0:v]fps=30,setsar=1[v0];[1:v]fps=30,setsar=1[v1];[v0][v1]concat=n=2:v=1:a=0[v]" \
-map "[v]" -c:v libx264 -pix_fmt yuv420p \
-y output.mp4
Here -ss and -t before -i set where each input starts and how long it lasts, fps and setsar make the two clips match, and the concat filter joins them. The clips must have the same resolution (add a scale filter if not). With audio you would also join the audio streams (a=1).
JSON2Video
{
"resolution": "full-hd",
"scenes": [
{
"elements": [
{ "type": "video", "src": "https://assets.json2video.com/assets/videos/beach-01.mp4", "seek": 2, "duration": 5 }
]
},
{
"elements": [
{ "type": "video", "src": "https://assets.json2video.com/assets/videos/new-york-01.mp4", "duration": 4 }
]
}
]
}
seek is the start point and duration the length; scenes play one after another. The resize property (cover or fit) sets how a clip of another size fills the frame. The output is a 1080p MP4 of 9 seconds. Add "transition": { "style": "fade", "duration": 0.5 } to the second scene for a cross-fade.
2. Burn subtitles into a video
FFmpeg
ffmpeg -i sample-house-drone.mp4 \
-vf "subtitles=captions.srt:force_style='FontSize=24'" \
-c:a copy \
-y output.mp4
The subtitles filter draws an existing SRT, ASS or similar file on the picture. It needs an FFmpeg build with libass, and it does not create the captions: you need the .srt file already (FFmpeg docs: subtitles filter). We could not run this one on our test machine, whose FFmpeg was built without libass, so we checked the syntax against the FFmpeg documentation.
JSON2Video
{
"resolution": "full-hd",
"scenes": [
{
"elements": [
{ "type": "video", "src": "https://cdn.json2video.com/assets/videos/sample-house-drone.mp4" }
]
}
],
"elements": [
{
"type": "subtitles",
"captions": "1\n00:00:01,000 --> 00:00:04,000\nA quiet house among the trees.\n\n2\n00:00:04,500 --> 00:00:07,500\nOpen for visits this weekend.\n",
"settings": { "style": "classic", "position": "bottom-center" }
}
]
}
This is the like-for-like version: you supply the SRT (as a URL or inline, as here). If you leave out captions, the subtitles element transcribes the movie's audio track automatically, which FFmpeg cannot do on its own. The sample clip is silent, so it needs the captions here. Styles include word-by-word highlighting.
3. Add background music
Put a quiet music track under a video, looped or cut to the video's length.
FFmpeg
ffmpeg \
-i sample-house-drone.mp4 \
-stream_loop -1 -i soft-piano.mp3 \
-filter_complex "[1:a]volume=0.2[music]" \
-map 0:v -map "[music]" \
-c:v copy -shortest \
-y output.mp4
-stream_loop -1 repeats the music indefinitely and -shortest stops at the end of the video; -c:v copy leaves the picture untouched. If the video already had a voice track, you would mix it with the music using amix; our lesson how to add audio to video with FFmpeg covers that case and more.
JSON2Video
{
"resolution": "full-hd",
"scenes": [
{
"elements": [
{ "type": "video", "src": "https://cdn.json2video.com/assets/videos/sample-house-drone.mp4" }
]
}
],
"elements": [
{ "type": "audio", "src": "https://cdn.json2video.com/assets/audios/soft-piano.mp3", "volume": 0.2, "loop": -1, "duration": -2 }
]
}
An audio element at movie level plays under all scenes; "loop": -1 with "duration": -2 repeats it for the length of the movie. Everything else you may add (a voice-over, captions) mixes in without audio filters.
What the comparison shows. For one operation on one file, FFmpeg is as short as the JSON and costs nothing. The JSON pulls ahead when jobs combine (trim, join, caption, add music and a voice-over in one video) and when the same layout is reused with new data, because you change values and not a filter graph.
Building videos instead of converting them? Describe the video in JSON and get an MP4 from one API call. The free account includes 600 credits (10 minutes of video, watermarked), no credit card. Get a free API key →
What JSON2Video does not do
JSON2Video is a video editing and rendering API, not a transcoder or packager. It does not create HLS or DASH streams, adaptive-bitrate ladders, DRM or multiple renditions of one file, and it is not meant for batch format conversion of files you simply want in another codec. For those jobs use MediaConvert or Coconut, a hosting API such as Mux that encodes on upload, or FFmpeg itself. If your pipeline also needs AI footage, see the AI video generation APIs guide.
Frequently asked questions
What is a video processing API?
A video processing API converts a video file you already have: a different format, codec, resolution or bitrate (transcoding or encoding), plus tasks such as extracting audio, creating thumbnails or burning in subtitles. You send the file and the settings, or an FFmpeg command, and download the result. AWS MediaConvert, Coconut, Rendi, Transloadit and Cloudinary are common choices.
What is the difference between transcoding and encoding?
Encoding turns raw or uncompressed video into a compressed format such as H.264. Transcoding converts video that is already compressed into another codec, size or bitrate. In practice, vendors use both words for the same service, and video transcoding and encoding APIs do both.
Is there an FFmpeg API?
FFmpeg itself is a command-line tool, not a web API. "FFmpeg as a service" products such as Rendi accept your FFmpeg command and input file URLs through an API, run them on their servers and return the output. Rendi's pricing (checked on 18 October 2026) starts with a free tier of 50 GB a month and Pro at $25 a month for 250 GB. You can also wrap FFmpeg in your own service; our FFmpeg wrappers lesson lists libraries for it.
What is an FFmpeg alternative for building videos?
For converting files, FFmpeg has no real rival: it is free and handles nearly every format. For composing videos (scenes, text, voice-over, captions, music, templates) a declarative video API such as JSON2Video replaces long FFmpeg filter graphs with JSON that describes the result. It does not replace FFmpeg for transcoding or streaming ladders.
How much does video transcoding cost?
On the per-minute services, an HD output minute costs $0.015 on Coconut and $0.015 on AWS MediaConvert Basic ($0.0075 with HD counting double), so 500 minutes cost about $7.50 on either. Data-based services charge by gigabytes processed instead: Rendi from $25 a month for 250 GB, Transloadit from $29 a month for 15 GB. Prices were checked on 18 October 2026. Self-hosted FFmpeg is free apart from your servers.
Can JSON2Video convert video formats or create HLS streams?
No. JSON2Video renders new videos from JSON (scenes, clips, text, voice-over, captions, music) as MP4. It does not produce HLS or DASH streams, bitrate ladders or format conversions of existing files. For those, use AWS MediaConvert, Coconut, a hosting API such as Mux, or FFmpeg.
Should I self-host FFmpeg or use an API?
Self-host when the jobs are simple, steady and already scripted: FFmpeg is free and gives you full control. Use an API when you would otherwise run and scale servers and queues, when load is bursty, or when you want to build composed videos without writing filter graphs.
More in this section: video APIs: the six types and how to choose, video editing API, AI video generation API and video hosting API. To learn FFmpeg itself, start the FFmpeg course or see how to crop a video and FFmpeg filters.
Published on October 18th, 2026