Convert an ffmpeg command into an API request.
Paste the command you run today. This page reads it in your browser and writes the
equivalent CreateJobRequest, then lists
every flag it could not carry over and why. No sign-up, nothing sent anywhere.
{
"input_url": "https://cdn.example.com/talk.mp4",
"managed": true,
"outputs": [
{
"type": "hls",
"video": [
{
"codec": "h264",
"resolution": "1080p",
"quality": "standard",
"framerate": 30,
"h264": {
"crf": 21
}
}
],
"segments": {
"duration": 6
},
"hls": {
"segment_format": "fmp4",
"playlist_type": "vod"
}
}
]
}How this request differs from your command
- `-preset` has ten rungs; quality has three (economy, standard, premium), so the nearest tier is used.
- HLS and DASH are packaged by Shaka Packager, not by ffmpeg, so segment settings are request fields rather than muxer flags.
- `managed: true` writes the output to Transcodely hosting. Replace it with `output_origin_id` to write to your own S3, GCS or R2 bucket.
What this converter deliberately will not do
A translation that silently drops a flag is worse than one that refuses it. These are the cases where the API has no equivalent, and the page says so rather than guessing.
HLS and DASH are not ffmpeg flags here
Packaging is done by Shaka Packager after the encode, so `-hls_time` becomes `segments.duration` and `-hls_segment_type` becomes `hls.segment_format`. Muxer flags like `-hls_flags` or `-var_stream_map` have no equivalent at all.
Audio is not configured inline
An output carries no audio codec or audio bitrate field: MP4, MOV and HLS get AAC, WebM gets Opus, and anything else is set on a preset. `-an` does map, to `disable_audio`.
Filters beyond scale are refused, not guessed
Watermarks and burned-in subtitles are their own request fields with their own shapes. A `-vf` chain carrying `unsharp`, `drawtext` or `overlay` is listed as unmapped rather than approximated.
Per-title and auto-ABR encoding are not currently available
The fields exist and are priced, but a job asking for content-aware encoding is rejected at creation with `parameter_unsupported` while the worker side is finished. Nothing on this page emits them.
Some accepted fields are inert
The encoder reads `crf` and `profile` from the codec options and nothing else, so `-maxrate`, `-bufsize`, `-tune` and `-level` are reported as unmapped instead of being written to a field that would be ignored.
A codec has to fit its container
VP9 in MP4, H.264 in WebM, AV1 in MOV and anything but H.264 on MPEG-TS HLS segments are all refused at job creation. The converter refuses them here instead of handing you a request that cannot run.
CRF has a narrower accepted band than ffmpeg
H.264 takes 15-35, H.265 18-35, VP9 15-50 and AV1 20-55. A value outside the band is clamped into it and the change is stated, rather than being sent and rejected. 10-bit H.264 is refused outright: the accepted profiles are baseline, main and high.
Every output must name a resolution
There is no source-passthrough member on the resolution list, so a command that never resizes still has to pick a rung. The converter assumes 1080p and says so — change it if your source is a different size.
Nothing leaves your browser
The parser, the mapper and the schema all run on this page. No command is uploaded, logged or sent to the API.
Run the request you just generated
The quickstart takes one API key and one call, and hands back a playable HLS URL.
Swap managed: true for an output_origin_id to write into your own
S3, GCS or R2 bucket instead.