L'infern del color: transcodificació i conservació BT.601 del «ffmpeg»

De tant en tant, es pot entrar en un territori estrany del vídeo digital de manera inesperada. Per exemple, només voleu retallar alguns enregistraments de pantalla fets en dispositius mòbils, com ara tauletes o telèfons mòbils, només per a descobrir que alguna cosa no ha anat bé amb els colors.

Metratge «habitual»

El drama comença amb metratge d'enregistrament de pantalla que sembla bastant innocent i normal a primera vista. Pot ser que s'hagi enregistrat en dispositius Android 7 utilitzant una aplicació d'enregistrament de pantalla (com ara «AZ Screen Recording», però no la falsificació «Pro»). I aquest metratge té dues propietats lleugerament inusuals:

  • una velocitat dels fotogrames altament variable,

  • utilitza BT.601[1], en lloc de BT.709[2] com tant material d'alta definició en aquests dies.

No hauria de causar problemes, oi? Bé…

Resulta que el motor multimèdia MLT del Kdenlive pot donar alguns problemes amb el metratge de vídeo que té una velocitat de fotogrames molt variable, com entre 0,001 i +100 fps. Els símptomes són subtils, però posen en perill la qualitat de la producció: sembla com si el MLT pogués triar un fotograma futur que està molt lluny en regions amb una freqüència baixa de fotogrames. Tot i que això no és un problema per a una freqüència de fotogrames adequadament alta, provoca resultats estranys en altres llocs. Per exemple, la interacció tàctil de l'usuari apareix fins i tot uns pocs segons abans que aparegui la interacció. Això és probablement causat per uns fps molt baixos durant el període d'inactivitat just abans de la interacció de l'usuari.

La transcodificació a una freqüència de fotogrames fixa segurament és una de les tasques fàcils del ffmpeg (aquest exemple assumeix una freqüència de fotogrames de projecte constant de 25 fps):

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

La freqüència de fotogrames constant soluciona els problemes esmentats anteriorment, de manera que els resultats són els que cal esperar. Excepte…

Transcodificació fàcil: color dolent

transcoding_color_change.webp

Malauradament, el vídeo resultant ara mostra colors canviats! Pot ser que no sigui massa obvi d'entrada, però pot ser molt pronunciat quan es treballa més amb el metratge. I és clarament visible per a l'audiència en cas que vagi a barrejar aquest metratge un al costat de l'altre amb altres versions processades, com ara els fotogrames extrets per a imatges.

Una inspecció més propera, ja sigui utilitzant la subfinestra de propietats dels clips integrada del Kdenlive o el ffprobe, mostra que en el fitxer transcodificat manca la indicació del perfil de color BT.601. No obstant això, el ffmpeg no transforma els colors durant la transcodificació, i simplement omet la informació correcta del perfil de color!

Mesures provisionals

kdenlive2308_clip_properties_color_space.webp

Sobreescriptura de l'espai de color de les propietats del clip

Per descomptat, sempre hi ha la capacitat del Kdenlive per a sobreescriure les propietats del clip d'origen utilitzant el giny integrat de propietats del clip.

Seleccioneu el clip de vídeo transcodificat a la safata del projecte. Després aneu a les propietats del clip i seleccioneu la pestanya «Força les propietats» document-edit. Marqueu Espai de color i seleccioneu ITU-R 601. El Kdenlive ara aplicarà el perfil de color correcte.

Encara que és molt fàcil, aquest mètode té les seves limitacions: està bé mentre es continua treballant només en l'editor del Kdenlive i el seu renderitzador MLT. Però tan aviat com s'usin eines de vídeo externes, com ara el ffmpeg per a l'extracció d'imatges, perdreu perquè aquestes eines no saben res del reemplaçament de les propietats de l'origen del Kdenlive. Per tant, cal aconseguir la informació correcta del perfil de color en els mateixos fitxers de vídeo transcodificats.

Conservant BT.601 en la transcodificació

Per a empitjorar aquest tema, la transformació del perfil de color aparentment òbvia

-vf colormatrix=bt601:bt601

senzillament no funciona: el ffmpeg es queixa que no pot transformar entre el mateix perfil de color d'entrada i sortida.

La peça del trencaclosques que falta es pot trobar al lloc «Stack Exchange's Video Production Q&A» en una publicació de 2015 preguntant «ffmpeg: explicitly tag h.264 as bt.601, rather than leaving unspecified?».

Hi ha una captura a vigilar: BT.601 ve amb els sabors PAL i NTSC que presenten cromaticitats primàries, corbes de transferència i espais de color lleugerament diferents. Per tant, comproveu primer el vostre metratge en brut utilitzant ffprobe (o MediaInfo) que s'hagi utilitzat durant l'enregistrament en aquest cas. Tingueu en compte que no importa que l'enregistrament de pantalla no tingui una resolució de definició estàndard (SD), però sí que importa quan es tracta de codificar el color.

ADN del PAL i NTSC

Com podem esbrinar si un fitxer de gravació de vídeo, diguem raw.mp4 utilitza un espai de color PAL o NTSC? Per descomptat, ffprobe ve al rescat. Però per a no perdre'ns en tots els detalls essencials que el ffprobe donarà, cal arreglar-ho amb algunes opcions i el grep:

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

Això hauria de tornar alguna cosa com aquestes línies:

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

La línia color_space=... ens dirà si tractem amb el PAL (bt470bg) o l'NTSC (smpte170m).

PAL

Si es tracta de cromaticitats del PAL (color_space=bt470bg), llavors cal transcodificar de la manera següent:

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

NTSC

Per a cromaticitats del NTSC (color_space=smpte170m), caldrà un conjunt diferent de primaris, corbes de transferència i espais de color:

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

En qualsevol cas, el Kdenlive/MLT ara veu correctament el vídeo transcodificat utilitzant el perfil de color BT.601. A més, altres eines multimèdia també detecten correctament el perfil de color, llevat que es trenquin amb el fet que no entenguin el BT.601 en absolut.

Notes

Fonts

El text original va ser enviat per l'usuari TheDiveO al blog kdenlive.org, ja desaparegut. Per a aquesta documentació s'ha extret de kdenlive.org i s'ha adaptat per a concordar amb l'estil general.