Barvni pekel: prekodiranje ffmpeg in ohranjanje BT.601

Občasno lahko povsem nepričakovano pridete na čudno območje digitalnega videa. Na primer, želite zmontirati nekaj zaslonskih posnetkov, narejenih v mobilnih napravah, kot so tablični računalniki ali mobilni telefoni, pa ugotovite, da je z barvami nekaj narobe.

Običajni posnetki

Drama se začne s posnetki zaslona, ki se na prvi pogled zdijo precej nedolžni in normalni. Morda so bili posnet v napravah Android 7 z aplikacijo za snemanje zaslona (kot je »AZ Screen Recording«, vendar ne ponaredek »Pro«). In ta posnetek ima dve nekoliko nenavadni lastnosti:

  • visoko spremenljivo hitrost v sličicah na sekundo,

  • uporablja BT.601[1], namesto BT.709[2], kot ga uporablja večina današnjih posnetkov HD.

Ne bi smelo povzročati težav, kajne? No …

Izkazalo se je, da ima lahko medijski pogon Kdenlive MLT nekaj težav z videoposnetki, ki imajo zelo spremenljivo hitrost sličic, na primer med 0,001 in 100+ sl/s. Simptomi so neopazni, vendar ogrožajo kakovost produkcije: zdi se, da lahko MLT v območjih z nizko hitrostjo sličic izbere prihodnjo sličico, ki je daleč stran od želene. Medtem ko to ni težava pri ustrezno visoki hitrosti sličic, pa to na drugih mestih povzroča čudne rezultate. Na primer, interakcija z dotikom uporabnika se prikaže tudi nekaj sekund prej, kot se bo pojavila. To je verjetno posledica zelo nizkega števila slik na sekundo v obdobju neaktivnosti tik pred interakcijo uporabnika.

Transkodiranje na fiksno hitrost sličic je gotovo ena od lažjih nalog ffmpeg (ta primer predpostavlja konstantno hitrost sličic projekta pri 25 sličicah na sekundo):

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

Konstantna hitrost reši zgoraj omenjene težave, zato bi morali biti rezultati pričakovani. Razen če …

Enostavno prekodiranje: obarvaj me čudno

transcoding_color_change.webp

Žal ima rezultat zdaj zamaknjene barve! Morda na prvem mestu ni preveč očitno, lahko pa je precej moteče, bolj ko s posnetki delate. In to postane jasno vidno za občinstvo v primeru, da boste mešali ta posnetek z nadalje predelanimi različicami, kot so izvlečene sličice za fotografije.

Natančnejši pregled z vgrajenim podoknom lastnosti posnetka v programu Kdenlive ali ffprobe pokaže, da prekodirana datoteka nima navedbe barvnega profila BT.601. Vendar ffmpeg med prekodiranjem sploh ni preoblikoval barv in je preprosto izpustil pravilne informacije o barvnem profilu!

Improvizirani ukrepi

kdenlive2308_clip_properties_color_space.webp

Preglasitev barvnega prostora v lastnostih posnetka

Seveda imate s Kdenlive vedno možnost, da prepišete lastnosti izvornega posnetka ob uporabi vgrajenega :term:`gradnika<widget>`lastnosti posnetka.

Preprosto izberite prekodirani videoposnetek v projektni posodi. Nato pojdite v Lastnosti posnetka in izberite zavihek »Vsili lastnosti« document-edit. Potrdite Barvni prostor in nato izberite ITU-R 601. Kdenlive zdaj uporabi pravilen barvni profil.

Čeprav je zelo enostavna, ima ta metoda svoje omejitve; to je v redu, dokler boste delali samo znotraj montažnega programa Kdenlive in njegovega izrisovalnika MLT. Toda takoj, ko boste morali uporabiti zunanja video orodja, kot so ffmpeg za ekstrakcijo slike, boste izgubljeni: ta orodja ne vedo o preglasitvi lastnosti izvornega posnetka v Kdenlive. Tako moramo dobiti pravilne informacije o barvnem profilu ravno v samo prekodirano video datoteko.

Ohranjanje BT.601 pri prekodiranju

Da bi bila ta zadeva še hujša, na prvi pogled očitna transformacija barvnega profila

-vf colormatrix=bt601:bt601

preprosto ne deluje: ffmpeg se pritožuje, da ne bo preoblikoval med istim vhodnim in izhodnim barvnim profilom.

Manjkajoči košček sestavljanke lahko najdete na spletnem mestu Stack Exchange Video Production Q&A v objavi iz leta 2015 z vprašanjem »ffmpeg: explicitly tag h.264 as bt.601, rather than leaving unspecified?«.

Pri tem je treba paziti na eno pomanjkljivost: BT.601 je na voljo v sistemih PAL in NTSC, ki imata nekoliko drugačne primarne kromatičnosti, prenosne krivulje in barvne prostore. Zato najprej z uporabo ffprobe (ali MediaInfo) preverite, kateri barvni prostor je bil uporabljen med snemanjem v vašem primeru. Upoštevajte, da ni pomembno, da vaš posnetek na zaslonu sploh nima standardne ločljivosti (SD), vendar je to pomembno, ko gre za kodiranje barv.

DNK PAL in NTSC

Kako torej ugotovimo, ali določena datoteka videoposnetka, na primer raw.mp4, uporablja barvni prostor PAL ali NTSC? Seveda nam na pomoč priskoči ffprobe. Da pa se ne bi izgubili v vseh podrobnostih, ki vam jih bo ffprobe navrgel, ga moramo ukrotiti z nekaj možnostmi in uporabimo ukaz grep:

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

To bi ti moralo vrniti nekaj v tej smeri:

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

Vrstica color_space=… nam pove, ali gre za PAL (bt470bg) ali NTSC (smpte170m).

PAL

Za barve PAL (color_space=bt470bg) moramo prekodirati na naslednji način:

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

NTSC

Za barve NTSC (color_space==smpte170m) bomo potrebovali drugačen nabor primarnih barv, krivuljo prenosa in barvni prostor:

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

V vsakem primeru Kdenlive /MLT zdaj pravilno vidi prekodirani video z uporabo barvnega profila BT.601. Poleg tega tudi druga medijska orodja pravilno zaznajo barvni profil – razen če so okvarjena ali pa sploh ne razumejo BT.601.

Opombe

Viri

Izvirno besedilo je uporabnik TheDiveO poslal na zdaj že ukinjen blog kdenlive.org. Za to dokumentacijo je bilo povzeto iz kdenlive.org in prilagojeno, da ustreza splošnemu slogu.