Kleurhel: Ffmpeg codering omzetten en BT.601 behouden

Van tijd tot tijd kunt u tamelijk onverwacht in merkwaardig digitale video-territorium terecht komen. U wilt bijvoorbeeld gewoon enige schermopnamen, gemaakt op mobiele apparaten, zoals tablets of mobiele telefoons, bewerken, om te vinden dat er iets mis is met de kleuren.

Opnamen Dertien-in-een-dozijn

Het drama begint met de opname van het scherm dat tamelijk onschuldig en normaal op het eerste gezicht lijkt. Het kan opgenomen zijn op Android 7 apparaten met een app voor het opnemen van een scherm (zoals «AZ Screen Recording», maar niet de “Pro” fake). En deze opname heeft twee tamelijk ongewone eigenschappen:

  • een zeer variabele framerate,

  • het gebruikt BT.601[1], in plaats van BT.709[2] zoals zo veel HD opnamen dezer dagen.

Zou toch geen problemen mogen geven? Wel…

Het blijkt dat de media-engine MLT van Kdenlive wat problemen kan geven bij filmmateriaal dat een zeer variabele framesnelheid heeft, zoals tussen de 0,001 en de 100+ fps. De symptomen zijn subtiel, maar brengen de productie-kwaliteit in gevaar: het lijkt erop dat MLT een toekomstige frame kan selecteren, die in stukken met een lage framesnelheid, helemaal verkeerd is. Terwijl dit geen probleem is bij een acceptabel hoge framesnelheid, veroorzaakt dit rare resultaten op andere plaatsen. Er verschijnen, bijvoorbeeld, gebruikersaanraakacties een paar seconden voor de interactie zelf. Dit wordt waarschijnlijk veroorzaakt door een zeer lage fps tijdens de inactieve periode net voor de gebruikersactie.

Transcoderen naar een vaste framesnelheid is zeker een de gemakkelijke taken voor ffmpeg (in dit voorbeeld wordt wordt een constante projectframesnelheid van 25 fps aangenomen):

ffmpeg -i raw.mp4 -r 25 -crf 18 screen-rec.mp4

De constante framesnelheid herstelt de hierboven genoemde problemen, zodat de resultaten zijn zoals verwacht. Behalve…

Eenvoudig Transcoderen: kleur me verkeerd

transcoding_color_change.webp

Helaas, de resulterende video toont kleurverschuivingen! Op het eerste gezicht valt het niet zo op, maar het kan vrij duidelijk zijn als u meer met uw filmmateriaal werkt. En het is duidelijk zichtbaar voor uw publiek in het geval dat u dit filmmateriaal gaat mengen met ander meer bewerkte versies daarvan, zoals uitgelichte frames voor foto’s.

Een nadere inspectie, naar keuze met het ingebouwde paneel voor clip-eigenschappen van Kdenlive of ffprobe, laat zien dat aan het getranscodeerde bestand de indicatie BT.601 kleurenprofiel ontbreekt. Maar, ffmpeg heeft helemaal de kleuren niet getransformeerd tijdens de transcodering, maar vergat eenvoudig de correcte kleurprofielinformatie!

Tijdelijke oplossingen

kdenlive2308_clip_properties_color_space.webp

Kleurruimte overschrijven van clip-eigenschappen

Er is natuurlijk altijd de mogelijkheid in Kdenlive om de clipeigenschappen van het materiaal te overschrijven in het ingebouwde widget voor clip-eigenschappen`.

Selecteer gewoon de getranscodeerde videoclip in de project-bin Ga dan naar de clip-eigenschappen en selecteer het tabblad “Eigenschappen afdwingen” document-edit. Activeer Kleurruimte en selecteer vervolgens ITU-R 601. Kdenlive zou nu het correcte kleurprofiel toepassen.

Ofschoon deze methode makkelijk in het gebruik is, heeft deze methode zijn beperkingen; het gaat goed zolang u uitsluitend werkt in de bewerker van Kdenlive en de MLT renderer daarvan. Maar zodra de noodzaak er is om externe videohulpmiddelen te gebruiken, zoals ffmpeg voor de extractie van afbeeldingen dan delft u het onderspit omdat deze hulpmiddelen niets weten van het overschrijven van de clipeigenschappen door Kdenlive. We zullen dus de correcte informatie over het kleurenprofiel in de getranscodeerde videobestanden zelf moeten krijgen.

Het bewaren van BT.601 tijdens het transcoderen

Om het nog erger te maken, de op het eerste blik duidelijke kleurenprofiel transformatie

-vf colormatrix=bt601:bt601

werkt gewoon niet: ffmpeg klaagt over niet kunnen transformeren tussen hetzelfde invoer en uitvoerkleurprofiel.

Het ontbrekende puzzelstuk is te vinden op de Video Production Q&A site van Stack Exchange in een post uit 2015 die vraagt om “ffmpeg: explicitly tag h.264 as bt.601, rather than leaving unspecified?”.

Er is iets om voor uit te kijken: BT.601 komt in PAL en NTSC smaken die iets verschillende primaire kleurkwaliteiten, overdrachtskrommen en kleurruimten karakteriseren. Controleer dus eerst uw ruwe opnamen met ffprobe (of MediaInfo) welke gebruikt is, in uw geval, tijdens opnemen. Merk op dat het niet uitmaakt dat uw schermopname helemaal geen standaard definitie (SD) resolutie heeft, maar het doet ter zake wanneer het aankomt op codering van kleur.

PAL en NTSC DNA

Maar hoe komen we te weten of een bepaald video-opnamebestand, laten we zeggen raw.mp4, de PAL of de NTSC kleurruimte gebruikt? Natuurlijk, komt ffprobe ons te hulp. Maar om niet verdwaald te raken in alle pietepeuterige details die ffprobe op u af zal sturen, moeten we het temmen door een paar opties te gebruiken met grep een hulpmiddel voor de opdrachtregel van Unix voor het zoeken naar regels die overeenkomen met een reguliere expressie):

ffprobe -v error -show_streams raw.mp4 | grep color_

Dit zou u zoiets als dit moeten geven:

color_range=tv
color_space=bt470bg
color_transfer=smpte170m
color_primaries=bt470bg

De gegel color_space=... vertelt ons of we te doen hebben met PAL (bt470bg) of NTSC (smpte170m).

PAL

Als het is PAL chromaticities (color_space=bt470bg) is moeten we als volgt transcoderen:

ffmpeg -i raw.mp4
-color_primaries bt470bg -color_trc gamma28 -colorspace bt470bg
-r 25 -crf 18 screen-rec.mp4

NTSC

Voor NTSC chromaticities (color_space=smpte170m) hebben we een andere set met primaries, overdrachtskromme en kleurruimte nodig:

ffmpeg -i raw.mp4
-color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m
-r 25 -crf 18 screen-rec.mp4
transcoding_comparison.webp

In beide gevallen, zal Kdenlive/MLT nu de getranscordeerde video correct zien met het BT.601 kleurprofiel. Daarnaast zullen ook andere mediahulpmiddelen het kleurprofiel correct detecteren – tenzij ze niet goed werken omdat ze BT.601 helemaal niet begrijpen.

Notities

Bronnen

De originele tekst was ingediend door TheDiveO op de nu niet meer functionerende kdenlive.org blog. Voor deze documentatie is het uit kdenlive.org gehaald en aangepast om te voldoen aan de stijl van het geheel.