Transcode, resize, or watermark videos
🤖/video/encode encodes, resizes, applies watermarks to videos and animated GIFs.
The /video/encode Robot is a versatile tool for video processing that handles transcoding, resizing, and watermarking. It supports various formats including modern standards like HEVC (H.265), and provides features such as presets for common devices, custom FFmpeg parameters for powerusers, watermark positioning, and more.
Usage example
Transcode uploaded video to HEVC (H.265):
{
"steps": {
"hevc_encoded": {
"robot": "/video/encode",
"use": ":original",
"preset": "hevc",
"ffmpeg_stack": "v6.0.0"
}
}
}
Parameters
-
use
String / Array of Strings / Object requiredSpecifies which Step(s) to use as input.
-
You can pick any names for Steps except
":original"
(reserved for user uploads handled by Transloadit) -
You can provide several Steps as input with arrays:
"use": [ ":original", "encoded", "resized" ]
💡 That’s likely all you need to know about
use
, but you can view Advanced use cases. -
-
output_meta
Object / Boolean ⋅ default:{}
Allows you to specify a set of metadata that is more expensive on CPU power to calculate, and thus is disabled by default to keep your Assemblies processing fast.
For images, you can add
"has_transparency": true
in this object to extract if the image contains transparent parts and"dominant_colors": true
to extract an array of hexadecimal color codes from the image.For videos, you can add the
"colorspace: true"
parameter to extract the colorspace of the output video.For audio, you can add
"mean_volume": true
to get a single value representing the mean average volume of the audio file.You can also set this to
false
to skip metadata extraction and speed up transcoding. -
preset
String ⋅ default:"flash"
Converts a video according to pre-configured settings.
If you specify your own FFmpeg parameters using the Robot's and/or do not not want Transloadit to set any encoding setting, starting
ffmpeg_stack: "v6.0.0"
, you can use the value'empty'
here. -
width
Integer(1
-1920
) ⋅ default: Width of the input videoWidth of the new video, in pixels.
If the value is not specified and the
preset
parameter is available, thepreset
's supplied width will be implemented. -
height
Integer(1
-1080
) ⋅ default: Height of the input videoHeight of the new video, in pixels.
If the value is not specified and the
preset
parameter is available, thepreset
's supplied height will be implemented. -
resize_strategy
String ⋅ default:"pad"
See the available resize strategies.
-
zoom
Boolean ⋅ default:true
If this is set to
false
, smaller videos will not be stretched to the desired width and height. For details about the impact of zooming for your preferred resize strategy, see the list of available resize strategies. -
crop
Object / JSON String ⋅ default:null
Specify an object containing coordinates for the top left and bottom right corners of the rectangle to be cropped from the original video(s). Values can be integers for absolute pixel values or strings for percentage based values.
For example:
{ "x1": 80, "y1": 100, "x2": "60%", "y2": "80%" }
This will crop the area from
(80, 100)
to(600, 800)
from a 1000×1000 pixels video, which is a square whose width is 520px and height is 700px. Ifcrop
is set, the width and height parameters are ignored, and theresize_strategy
is set tocrop
automatically.You can also use a JSON string of such an object with coordinates in similar fashion:
"{ \"x1\": <Integer>, \"y1\": <Integer>, \"x2\": <Integer>, \"y2\": <Integer> }"
-
background
String ⋅ default:"00000000"
The background color of the resulting video the
"rrggbbaa"
format (red, green, blue, alpha) when used with the"pad"
resize strategy. The default color is black. -
rotate
Integer(0
,90
,180
,270
,360
) / Boolean ⋅ default: autoForces the video to be rotated by the specified degree integer. Currently, only multiples of
90
are supported. We automatically correct the orientation of many videos when the orientation is provided by the camera. This option is only useful for videos requiring rotation because it was not detected by the camera. If you setrotate
tofalse
no rotation is performed, even if the metadata contains such instructions. -
hint
Boolean ⋅ default:false
Enables hinting for mp4 files, for RTP/RTSP streaming.
-
turbo
Boolean ⋅ default:false
Splits the video into multiple chunks so that each chunk can be encoded in parallel before all encoded chunks are stitched back together to form the result video. This comes at the expense of extra Priority Job Slots and may prove to be counter-productive for very small video files.
-
chunk_duration
Integer ⋅ default: autoAllows you to specify the duration of each chunk when
turbo
is set totrue
. This means you can take advantage of that feature while using fewer Priority Job Slots. For instance, the longer each chunk is, the fewer Encoding Jobs will need to be used. -
freeze_detect
Boolean ⋅ default:false
Examines the transcoding result file for video freeze frames and re-transcodes the video a second time if they are found. This is useful when you are using
turbo: true
because freeze frames can sometimes happen there. The re-transcode would then happen without turbo mode.
FFmpeg parameters
-
ffmpeg_stack
String ⋅ default:"v5.0.0"
Selects the FFmpeg stack version to use for encoding. These versions reflect real FFmpeg versions. We currently recommend to use
"v6.0.0"
.Supported values:
"v5.0.0"
,"v6.0.0"
.A full comparison of video presets, per stack, can be found here.
-
ffmpeg
Object ⋅ default:{}
A parameter object to be passed to FFmpeg. For available options, see the FFmpeg documentation. If a preset is used, the options specified are merged on top of the ones from the preset.
The FFmpeg
r
parameter (framerate) has a default value of25
and maximum value of60
.If you set
r
tonull
, you clear the default of25
and can preserve the original video's framerate. For example:"steps": { "encoded": { "robot": "/video/encode", "use": ":original", "ffmpeg_stack": "v6.0.0", "preset": "web/mp4/1080p", "ffmpeg": { "b:v": "600k" } } }
You can also add
input_options
which will be used before the-i
in ffmpeg. For example in the following case, the final command will look likeffmpeg -fflags +genpts -i input_video ...
:"steps": { "encoded": { "robot": "/video/encode", "use": ":original", "ffmpeg_stack": "v6.0.0", "preset": "web/mp4/1080p", "ffmpeg": { "input_options": { "fflags": "+genpts" }, "b:v": "600k" } } }
HLS Parameters
This Robot supports the following HLS parameters, but we now recommend using our specialized 🤖/video/adaptive instead.
hls parameters
-
segment
Boolean ⋅ default:false
Splits the file into multiple parts, to be used for Apple's HTTP Live Streaming.
-
segment_duration
Integer ⋅ default:10
Specifies the length of each HTTP segment. This is optional, and the default value as recommended by Apple is
10
. Do not change this value unless you have a good reason. -
segment_prefix
String ⋅ default: Basename of inputThe prefix used for the naming. For example, a prefix of
"segment_"
would produce files named"segment_0.ts"
,"segment_1.ts"
, and so on. This is optional, and defaults to the base name of the input file. Also see the relatedsegment_name
parameter. -
segment_name
String ⋅ default:"${segment_prefix}${segment_number}.ts"
The name used for the final segment. Available variables are
${segment_prefix}
,${segment_number}
and${segment_id}
(which is a UUIDv4 without dashes).
Watermarking parameters
-
watermark_url
String ⋅ default:""
A URL indicating a PNG image to be overlaid above this image. You can also supply the watermark via another Assembly Step.
-
watermark_position
String / Array of Strings ⋅ default:"center"
The position at which the watermark is placed. The available options are
"center"
,"top"
,"bottom"
,"left"
, and"right"
. You can also combine options, such as"bottom-right"
.An array of possible values can also be specified, in which case one value will be selected at random, such as
[ "center", "left", "bottom-left", "bottom-right" ]
.This setting puts the watermark in the specified corner. To use a specific pixel offset for the watermark, you will need to add the padding to the image itself.
-
watermark_x_offset
Integer ⋅ default:0
The x-offset in number of pixels at which the watermark will be placed in relation to the position it has due to
watermark_position
.Values can be both positive and negative and yield different results depending on the
watermark_position
parameter. Positive values move the watermark closer to the image's center point, whereas negative values move the watermark further away from the image's center point. -
watermark_y_offset
Integer ⋅ default:0
The y-offset in number of pixels at which the watermark will be placed in relation to the position it has due to
watermark_position
.Values can be both positive and negative and yield different results depending on the
watermark_position
parameter. Positive values move the watermark closer to the image's center point, whereas negative values move the watermark further away from the image's center point. -
watermark_size
String ⋅ default:""
The size of the watermark, as a percentage, such as
"50%"
. How the watermark is resized greatly depends on thewatermark_resize_strategy
. -
watermark_resize_strategy
String ⋅ default:"fit"
Available values are
"fit"
,"stretch"
and"area"
.To explain how the resize strategies work, let's assume our target video size is 800×800 pixels and our watermark image is 400×300 pixels. Let's also assume, the
watermark_size
parameter is set to"25%"
.For the
"fit"
resize strategy, the watermark is scaled so that the longer side of the watermark takes up 25% of the corresponding video side. And the other side is scaled according to the aspect ratio of the watermark image. So with our watermark, the width is the longer side, and 25% of the video size would be 200px. Hence, the watermark would be resized to 200×150 pixels. If thewatermark_size
was set to"50%"
", it would be resized to 400×300 pixels (so just left at its original size).For the
"stretch"
resize strategy, the watermark image is stretched (meaning, it is resized without keeping its aspect ratio in mind) so that both sides take up 25% of the corresponding video side. Since our video is 800×800 pixels, for a watermark size of 25% the watermark would be resized to 200×200 pixels. Its height would appear stretched, because keeping the aspect ratio in mind it would be resized to 200×150 pixels instead.For the
"area"
resize strategy, the watermark is resized (keeping its aspect ratio in check) so that it covers"xx%"
of the video's surface area. The value fromwatermark_size
is used for the percentage area size. -
watermark_start_time
Float ⋅ default:0.0
The delay in seconds from the start of the video for the watermark to appear. By default the watermark is immediately shown.
-
watermark_duration
Float ⋅ default:-1.0
The duration in seconds for the watermark to be shown. Can be used together with
watermark_start_time
to create nice effects. The default value is-1.0
, which means that the watermark is shown for the entire duration of the video. -
watermark_opacity
Float ⋅ default:1.0
The opacity of the watermark. Valid values are between
0
(invisible) and1.0
(full visibility).
On watermarking
With watermarking you can add an image to a video. This is usually used for logos, but you could also Surround a video with a frame if you cut out a transparent center from your image.
Supplying the watermark via an Assembly Step
You can pass both the video and the watermark image to an Assembly Step via the use
parameter, allowing you to have both be part of the upload, or to use the results of other
Assembly Steps as input to your
🤖/video/encode Step.
For this to work, you just need to use the as
-syntax:
{
"steps": {
"watermarked": {
"bundle_steps": true,
"robot": "/video/encode",
"use": {
"steps": [
{ "name": ":original", "as": "video" },
{ "name": ":original", "as": "watermark" }
]
},
"ffmpeg_stack": "v6.0.0"
}
}
}
Here, both the video and the watermark image are taken from the uploaded files. They are recognized automatically based on their file type.
If you use several file input fields, then you can tell Transloadit which field supplies the base
video and which the watermark. Suppose you have two file input fields named the_video
and
the_watermark
. These Assembly Instructions will make it work using the fields
condition:
{
"steps": {
"watermarked": {
"bundle_steps": true,
"robot": "/video/encode",
"use": {
"steps": [
{ "name": ":original", "fields": "the_video", "as": "video" },
{ "name": ":original", "fields": "the_watermark", "as": "watermark" }
]
},
"ffmpeg_stack": "v6.0.0"
}
}
}
The Robot's watermark_url
parameter will still continue to work.
Demos
- Apply a watermark to videos
- Convert a GIF to a video
- Crop a video to fit a LinkedIn feed post
- Detect edges of a subject in a video
- Encode a video into WebM
- Encode a video, extract 8 thumbnails and store everything in an S3 bucket
- Encode blur-out effect into video file
- Encode video for Android
- Encode video for Android, preserving the original quality
- Encode video for browsers in 720p
- Encode video for iPhone and strip the sound
- Encode video into one of Apple's ProRes formats
- Encode video to HEVC
- Extract 10 thumbnails and modify their size
- Extract a 10 second clip from a video
- Implement HTTP Live Streaming (HLS)
- Implement MPEG-Dash using Transloadit
- Join multiple videos sharing one audio track
- Make video compatible for all devices
- Manipulate video playback speeds
- Overlay videos with dynamic artwork, generated with HTML & JS
- Remove a green screen from a video
- Rotate a video clip by 90 degrees
- Specify multiple encoding Steps for a single file
- Surround a video with a frame using a watermark
Related blog posts
- Auto-rotation for iPhone video uploads launched November 19, 2010
- Real-time encoding - over 150x faster December 20, 2010
- Transloadit announces WebM support with watermarking April 27, 2011
- Launching audio encode Robot & exciting new updates November 21, 2011
- Stability & performance boosts with enhanced scaling July 24, 2012
- Helping Coursera bring education to millions around the world February 11, 2015
- Enhancing FFmpeg for superior encoding performance July 30, 2015
- Happy 2016 from Transloadit December 31, 2015
- Introducing MPEG-DASH support for adaptive streaming October 11, 2016
- New pricing model for future Transloadit customers February 7, 2018
- Transloadit launches Turbo Mode for faster video encoding November 15, 2018
- How to insert watermarks to videos with Transloadit February 20, 2019
- Creating audio waveform videos with FFmpeg & Node.js January 4, 2021
- Let's Build: spinning record GIF generator April 1, 2021
- Build a Reddit video subtitling bot with Transloadit February 10, 2022
- Creating engaging audio visualizations with Transloadit April 2, 2023
- Optimizing video quality with advanced compression May 2, 2023
- Easily remove green screens with Transloadit & FFmpeg June 2, 2023
- MKV vs MP4 - which format is better for video? June 27, 2023
- How to build a 360° video player with Three.js & Transloadit August 21, 2023
- How to install FFmpeg on Windows: a complete guide September 15, 2024