Media Encoding with ffmpeg

We will break the encoding process into three parts:

  1. The RGB to YCrCb conversion
  2. The encoding process itself
  3. Metadata tagging for web browsers

Color space conversion.

FFmpeg is not a great tool for colorspace conversion. We recommend that any color space conversion be done using tools such as Nuke or oiiotool using OCIO. We strongly recommend using the ACES configuration whenever possible, since it provides a good baseline for colorspace conversion. Note, we may mention the use of Nuke a number of times, there are now a large number of 3rd party tools that will also do great at this color space conversion using OCIO.

Typically, we would assume that an intermediate file would get written out, such as PNG, TIF or DPX for processing in ffmpeg.

Hint: by default the nuke PNG writer will have the slow compression enabled, this does add a little time that is unnecessary for the sort of intermediate file we are using. In the nuke SDK they do provide the source for the PNG writer, so it is possible to get this disabled. However, you may find that switching to Tif will have the same result.

Easy install of OCIO/OIIO/FFmpeg

Different approaches for getting started include: anaconda you will also need to download the ACES OCIO configuration files from: https://github.com/colour-science/OpenColorIO-Configs

conda create --name aswf-ffmpeg
conda activate aswf-ffmpeg
conda install -c conda-forge py-openimageio
pip install PyYAML pillow

This should give you py-openimageio, openimageio and ffmpeg-4.4

TODO - Provide other approaches for quickly getting going (e.g. vcpkg)

Quick introduction to color conversion using oiiotool

export OCIO=ocio://studio-config-v1.0.0_aces-v1.3_ocio-v2.1 # Or wherever your OCIO is, this is using a builtin OCIO config, with OCIO 2.2 or newer.
oiiotool --framepadding 5 --frames 1-100 sourcefilename_acescg.#.exr --resize 1920x0 \
       --colorconvert acescg srgb --dither -o outputimage.#.png
–frames 1-100 The frame range of the source media.
–framepadding 5 Set the framepadding to 5 (i.e. outputimage.00001.tif)
–resize 1920x0 Resize the image so that the width is 1920 wide, and adjust the height so that the aspect ratio stays the same. (Note you may want to use –fit too). This will use the lanczos3 filter for decreasing resolution, and the blackman-harris filter for increase resolution.
–colorconvert acescg srgb Do a colorspace convert from ACEScg to sRGB. (See the autocc flag below)
–dither Adding a dither process when writing to an 8-bit file

Other flags you might want to use include:

–missingfile checker If a frame is missing, put a checkboard frame in its place.
–threads 2 If you want to limit the number of threads the oiiotool process consumes, the default is as many threads as there are cores present in the hardware
–autocc Turns on automatic color space conversion,

The above will work well for many of the h264 files, but for generating movies with an extended bit depth (8-16), you may want to do:

export OCIO=~/git/OpenColorIO-Configs/aces_1.2/config.ocio # Or wherever your OCIO is.
oiiotool --framepadding 5 --frames 1-100 sourcefilename_acescg.#.exr --resize 1920x0
         --colorconvert acescg srgb -d uint16 -o outputimage.#.png

Adding the -d uint16 flag forces the intermediate file format to be 16-bit, rather than the 8-bit default. Note, we have also removed the dither flag.

Image resizing.

There are a couple of gotchas with image resizing to watch out for:

See Also.

The following utility - https://github.com/jedypod/generate-dailies calls openimageio directly in python to do the image conversion, exporting the resulting file directly to ffmpeg. It has a nice configuration file for text overlays and ffmpeg configuration that is worth looking at too.


Copyright © 2022 ORI Contributors. Distributed under a CC BY 4.0 license.