Learn how to optimize your video files for the fastest processing time.
Mux Video accepts most modern video formats and codecs. However, certain types of inputs need to be standardized in order for Mux to do further operations on them, and this can add time before the video is ready to be streamed. If you want to standardize your content before sending it to Mux, and potentially improve performance, this guide will show what you need to do.
To be considered standard input, the input video file must meet the following requirements:
max_resolution_tier
of 1080pAssets ingested up to 1080p are subject to the following standard input requirements.
max_resolution_tier
.max_resolution_tier
of 2160p (4K)Assets ingested at 2K and 4K resolutions are subject to the following standard input requirements.
As a starting point, here is a sample ffmpeg command for creating video that complies with Mux standard input. Feel free to modify this by using things like 2-pass encoding, different presets, or different bitrates (as long as the total bitrate ends up below than 8Mbps).
ffmpeg -i input.mp4 -c:a copy -vf "scale=w=min(iw\,1920):h=-2" -c:v libx264 \
-profile high -b:v 7000k -g 239 -pix_fmt yuv420p -maxrate 16000k -bufsize 24000k out.mp4
If you are creating a 4K video, the resolution and bitrate limits are higher. Here is a sample ffmpeg command for creating video that complies with Mux standard input for 4K.
ffmpeg -i input.mp4 -c:a copy -vf "scale=w=min(iw\,4096):h=-2" -c:v libx264 \
-profile high -b:v 18000k -g 239 -pix_fmt yuv420p -maxrate 36000k -bufsize 54000k out.mp4
Most mobile devices capture H.264 8-bit 4:2:0 video by default. Here are the main things to watch out for:
Mux Video works fine with video outside of the standard input specs. But because other videos cannot be easily streamed to many modern devices, Mux Video must perform an initial encoding operation on non-standard input to create a mezzanine file. This means that non-standard input will be slower to ingest.
As soon as Mux Video detects that the input file is non-standard, it emits the video.asset.non_standard_input_detected
. This lets you know right away that your video will need additional processing time, along with the specific reasons why it's considered non-standard.
{
"type": "video.asset.non_standard_input_detected",
"data": {
"id": "{ASSET_ID}",
"status": "preparing",
"non_standard_input_reasons": {
"video_gop_size": "high"
}
// ... other asset fields
}
}
Note that non_standard_input_reasons
may not be finalized as additional reasons maybe found later and will be included on the asset after ingest completion.
Mux Video also exposes this information in all subsequent asset webhooks, including the video.asset.ready
event. This information is also returned in the asset object when retrieved using the Get Asset APIAPI.
When an asset needs additional processing, you can use the progress
field from the Get Asset APIAPI response, which returns the current state
of and, the completion percentage of a transocode.
// GET /video/v1/assets/{ASSET_ID}
{
"id": "{ASSET_ID}",
"status": "preparing",
"non_standard_input_reasons": {
"video_gop_size": "high"
},
"progress": {
"state": "transcoding",
"progress": 23.02
}
// ... other asset fields
}
This field tells you both the current processing state and an estimated completion percentage from 0
to 100
, allowing you to keep your users informed with accurate progress indicators.
The progress field can have the following state
s:
transcoding
: Asset is undergoing non-standard transcoding. progress
will be between 0
and 100
.ingesting
: Asset is being ingested (initial processing before or after transcoding). Progress will be 0
.errored
: Asset has encountered an error (status
is errored
). Progress will be -1
.completed
: Asset processing is complete (status
is ready
). Progress will be 100
.live
: Asset is a live stream currently in progress. Progress will be -1
.The max duration for any single asset is 12 hours.