RGB Encoding

You do not have to encode into YCrCb, there are a number of codecs that support RGB directly.

It does lower the compression efficiency a little, but eliminates any concern that the YCrCb conversion is affecting the imagery.

Codec Family ffmpeg codec Bit depth pix_fmt Web Support
h264 libx264rgb 8   no
HEVC/H265 libx265 8 10 12 rgb rgb-10 rgb-12 All browsers
HEVC/H265 hevc_videotoolbox 8 10 rgb rgb-10 rgb-12 All browsers
VP9 libvpx-vp9 8 10 12 rgb rgb-10 rgb-12 All Browsers
Mjpeg mjpeg 8 yuv-4:2:2 yuv-4:4:4 no
DNxHD dnxhd 8 10 rgb no

H264 RGB Encoding

h264 does support RGB encoding, which may be preferable in some situations.

Using the encoder:

-c:v libx264rgb

Has no support in web browsers, but there is limited support in players such as RV.

mjpeg RGB Encoding

For more details see: Mjpeg. This is an 8-bit only encode.

	-c:v mjpeg -color_primaries bt709 -color_range pc -color_trc bt709 -colorspace rgb -pix_fmt rgb24 -q:v 2 -vf "scale=in_range=full:out_range=full"

VP9 RGB Encoding

VP9 has some excellent 10 and 12 bit RGB encodes.

Example encoding:

ffmpeg -r 24 -start_number 1 -i inputfile.%04d.png -frames:v 200 -c:v libvpx-vp9 \
    -crf 22 -pix_fmt gbrp10le -quality good -row-mt 1 -speed 2 -vf "scale=in_range=full:out_range=full" \
    -color_primaries bt709 -color_range pc -color_trc bt709 -colorspace rgb   \
     -y outputfile.mp4

RGB Comparisons

label Codec Params
8_bit_libx264rgb -c:v libx264rgb -color_primaries bt709 -color_range pc -color_trc bt709 -colorspace rgb -crf 18 -pix_fmt rgb24 -preset slow -vf “scale=in_range=full:out_range=full” -x264-params keyint=15:no-deblock=1
8bit_mjpeg -c:v mjpeg -color_primaries bt709 -color_range pc -color_trc bt709 -colorspace rgb -pix_fmt rgb24 -q:v 2 -vf “scale=in_range=full:out_range=full”
vp9_10bit_rgb -c:v libvpx-vp9 -color_primaries bt709 -color_range pc -color_trc bt709 -colorspace rgb -crf 22 -pix_fmt gbrp10le -quality good -row-mt 1 -speed 2 -vf “scale=in_range=full:out_range=full”
vp9_12bit_rgb -c:v libvpx-vp9 -color_primaries bt709 -color_range pc -color_trc bt709 -colorspace rgb -crf 22 -pix_fmt gbrp12le -quality good -row-mt 1 -speed 2 -vf “scale=in_range=full:out_range=full”
vp9_8bit_rgb -c:v libvpx-vp9 -color_primaries bt709 -color_range pc -color_trc bt709 -colorspace rgb -crf 22 -pix_fmt gbrp -quality good -vf “scale=in_range=full:out_range
This is showing different rgb encoding against file size.
This is showing different rgb encoding against encoding time
This is showing different rgb encoding against mean VMAF

For more details see:


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