← All articles

Why Do My Video's Colours Look Different in Every Player?

The same video looks right in your editor, a little washed out in the browser and slightly too red on your phone. Nobody changed the file. Each player read it differently, because the file left out the part that tells them how.

A video stores numbers, not colours

Each pixel in a typical video is stored as three numbers: one for brightness and two for colour differences. Turning those into the red, green and blue your screen shows requires knowing which recipe was used to make them. A video file can carry that recipe in a set of colour tags:

  • Matrix: how brightness and colour-difference numbers convert to RGB (BT.601 for old standard-definition, BT.709 for HD).
  • Primaries: which exact red, green and blue the numbers refer to.
  • Transfer: the brightness curve (ordinary SDR, or HDR curves such as PQ and HLG).
  • Range: whether black is stored as 16 and white as 235 (“limited”, the video norm) or black as 0 and white as 255 (“full”).

What happens when the tags are missing

The player has to guess, and different players guess differently. The two mistakes you can actually see:

  • Range guessed wrong. Limited-range video read as full shows black as dark grey and white as light grey — the classic washed-out look. Full-range video read as limited crushes shadows to solid black and blows out highlights.
  • Matrix guessed wrong. HD video decoded with the standard-definition matrix shifts colours slightly: greens and reds drift and skin tones look off. Subtle on its own, obvious side by side.

Screen recorders, some export presets and quick command-line conversions are the usual sources of untagged files.

How to check

The video quality checker reads the stream’s headers and notes it plainly: “The file carries no colour tags at all.” It is a note rather than a fault — the picture may be perfectly good — but it explains why it looks different from one app to the next.

HDR is a separate case with a similar symptom: on a player that does not convert HDR for an ordinary screen, HDR footage looks flat and washed out even when it is tagged correctly. The checker notes that too.

How to fix it

  • In an editor: export with an explicit colour space, normally Rec.709, limited range, for anything going to the web or a TV.
  • With ffmpeg, when re-encoding, write the tags out explicitly:
ffmpeg -i input.mp4 -c:v libx264 -crf 18 \
  -colorspace bt709 -color_primaries bt709 -color_trc bt709 -color_range tv \
  -c:a copy output.mp4

Those flags label the output; they do not convert it. Use them when the pixels really are Rec.709 limited range — which is what almost all ordinary HD footage is. If an earlier step already decoded the file with the wrong guess, fix that step, because the wrong colours are then baked into the pixels.

Comparing two versions

If two exports of the same edit look different, compare them in DiffALL’s video comparison before blaming the grade: an untagged export next to a tagged one can differ only in how it is displayed, and the comparison shows where the pixels themselves changed.

No original to compare against? DiffALL measures one file on its own and names what is wrong with it.

Check a file — free