– fordi tiden kræver et MODSPIL

06. Feb 2008

Fri software og multimedier: Preprocessing med mjpegtools

 
- af Rene Jensen

Eksempel på  arbejdsgange ved preprocessering med mjpegtools Preprocessing 1 - mjpegtools
Inden snakken går videre til videoredigering og effekter, vil jeg udgyde mine erfaringer med at klargøre optagelserne inden brug. Jeg bruger et ganske normalt konsumkamera fra før verden gik HD. Næsten alle kameraer optager i interlace (dvs. to tidsforskudte fields sættes sammen til et frame). Interlacede billeder bliver hurtigt grimme, hvis de forstørres eller på anden måde transformeres, som jeg gjorde med Blender i sidste indlæg. Man siger ganske vist, at til videobrug er det bedst at beholde interlace, men så forudsætter man også, at der ikke sker andet i redigeringen end simpel sammenklipning. Laver man en digital zoom på et interlaced billede, så linjerne ikke længere passer med TV-billedets egne, så bliver det grimt.

En anden god grund til preprocessing er støj og forkert farvebalance.

Redskaberne

Mit foretrukne redskab er mjpegtools. Da jeg skulle lave MPEG2-filer til DVD-produktion, var det det eneste toolkit, der ikke lavede videofiler, der havde en eller anden defekt, eller som crashede. Ganske vist skal man være nærmest ekspert for at kunne finde rundt i alle parametrene til FFMPEG, Transcoder, Mencoder, GSTREAMER osv. Men man kan godt forlange af dem alle, at audio og video ikke ryger ud af synkronisering med hinanden, næsten ligegyldigt hvor tåbeligt, man bærer sig ad.

Mjpegtools er en samling små programmer, der køres fra en kommandoprompt (i Linux en såkaldt shell). Hvert program klarer sin lille opgave, og fordi de er shell-baserede, så følger de det tudsegamle princip om at outputtet fra et program føres ind i inputtet i næste program i kæden. Ingen grafisk brugergrænseflade, kun en lang kommando med kæder af små programmer, der giver billeder videre til hinanden - velkommen til fri software. Som en kammerat sagde engang: "Jeg vidste, at det måtte være open source. Det var jo mere kompliceret, end det havde været nødvendigt at være"... Æh joo, hvis tastaturer er skræmmende. Men kender man bare lidt til bash, så er der noget at hente.

Et par nøgleprogrammer:

glav: Det eneste grafiske program i listen. Den kan bruges til at lave en liste af start-stop-positioner i en videofil (eller flere i træk). Listen er en simpel tekstfil i stil med:

LAV Edit List
PAL
1
/tmp/optagelse001.avi
0 62 224
0 1277 1505

... Hvor hver af de nederste linjer markerer start- og stop-frame for det aktuelle segment. Primitivt, men brugbart.

lav2yuv: Dette program vil typisk være starten af en kæde. Det læser fra en videofil, som skal være en AVI-fil med en Mjpeg-codec (lang historie, ikke vigtigt. Jeg siger det bare, så læseren er advaret om at det ikke nytter noget at hente en tilfældig video i AVI-format ned fra nettet).

lav2wav: Broderen til ovennævnte, der bruges til at splitte lyden ud separat. Begge disse progammer kan enten arbejde med en AVI-fil direkte, eller med en liste produceret af glav, så man kan klippe i sin optagelse ad den vej.

yuvplay: Viser billederne, der kommer ind i programmet i et grafisk vindue, så det skal altså placeres sidst i en kæde.

yuvdeinterlace: fjerner deinterlace. Jeg er ikke sikker på hvilken algoritme, men generelt synes jeg om resultatet. Eksempel: lav2yuv mit_klip.avi | yuvdeinterlace | yuvplay. Denne kæde afspiller AVI-filen mit_klip.avi, og smider hvert billede igennem yuvdeinterlace, hvorfra det ryger videre til fremvisning i et vindue på skærmen.

yuvfps: Ændrer framerate på den grove måde: Forlænger ved at gentage samme frame mange gange, forkorter ved at skippe frames.

yuvkineco: Nyttigt værktøj til at forsøge at genetablere en oprindelig framerate, med begrænset succes, men bedre end så mange. En del af de (ellers ret fede) public domain-film, der kommer på Bathos-DVD'en har tit undergået rigtigt ubehagelige forsøg på at presse en 24fps film ind i et NTSC (amerikansk TV-standard) 30fps format. Derfra skulle jeg konvertere videre til PAL (europæisk TV-standard) 25fps. Resultatet lignede opkastende ninjaer i strobelys. Yuvkineco reddede filmen en god del.

yuvdenoise: Støjfjerning. Kan glatte ud både spatialt (mellem de enkelte pixels i et billede) og temporalt (dvs. den lader et billede bløde igennem til de næste i rækken, så de tværes ud over tid)

mpeg2enc: Konverterer filen til en MPEG2-videofil (uden lyd)

mplex: En såkaldt multiplexer, som bruges til at mikse en videofil og en audiofil sammen til en film, klar til at blive brugt til DVD-authoring.

Jeg har prøvet at lave et eksempel på slowmotion ud fra nogle voldsomt rystende optagelser af en gade en regnvåd aften:



Min kommandolinje så sådan her ud:
lav2yuv -C 420jpeg preproc1_wetstones.list |  yuvdeinterlace -s0 -f | \
           yuvfps -r 75:1 | yuvdenoise -s 2,4,4 -t 30,20,20 > /tmp/temp.avi
Forklaring:
  • lav2yuv afspiller kliplisten.

  • yuvdeinterlace fikser interlace på hvert frame. Den havde nogle problemer pga. de ekstremt rystende optagelser, som jeg næsten men ikke helt er parat til at se gennem fingre med.

  • yuvfps ændrer framerate til 75 fps, altså sådan at hver frame gentages tre gange.

  • yuvdenoise glatter ud imellem de enkelte frames (temporal filtrering), så hele sekvensen bliver mere blød. Ellers kommer det til at se hakkende og ubehageligt ud.

Resultatet gemmes i /tmp/temp.avi, som bliver gigantisk, hvorefter jeg komprimerer med mencoder:
mencoder -idx -oac lavc -ovc lavc -lavcopts \
         vcodec=mpeg4:vbitrate=1100000 -fps 25 /tmp/temp.avi -o preproc1_slowmo.avi

Cross-platform?
For nogle år tilbage var det overvejende sandsynligt, at et Open Source program ikke kunne køre på Windows eller Mac-OSX, og endda kun på visse varianter af Linux. Den situation har ændret sig en del på det seneste, især fordi de grundlæggende biblioteker af funktioner, som mange projekter gør brug af, er ved at være stabile på flere platforme og fordi selve det udviklingsmiljø, som mange projekter udvikles i, langsomt er ved komme med over i form af MingW og Msys og Cygwin.

Men jeg har lovet mig selv at gøre det modsatte af hvad mange skribenter ofte gør, nemlig ukritisk at tro på alt man læser. Så da jeg så på mjpegtools' hjemmeside, at man kunne finde en Windows-version her(vælg filen, der ender på ".zip"), så tog jeg mig i glædesstrålende at bilde læserne ind, at det forholder sig sådan, og i stedet prøve at se, om skidtet virkede.

Skidtet virkede ikke. Jeg nåede ikke engang til at få svar på det meget gode spørgsmål om hvorvidt DOS understøtter pipes (den lodrette streg, |, mellem programmerne, som jo primært er en shell-funktion). For på ingen måde ville første led i kæden starte op: lavplay, lav2yuv og jpeg2yuv enten crashede eller klagede over ikke understøttede formater. (Men en lille sidegevinst var, at jeg opdagede et rart lille gratis program til at capture DV fra kameraet til en fil: WinDV).

Konklusion
Hvordan virker mjpegtools så i sammenligning med andre, eventuelt kommercielle, programmer? Jeg tror egentlig helst, jeg er fri for at udtale mig. Mjpegtools har værdi for mig, fordi redskabet repræsenterer et solidt ståsted i en gigantisk medie-konverteringsjungle. De bedste folk at spørge er faktisk DVD-rippere, downloadere og pirater (de fleste her kender vel doom9.org), for de har daglig kontakt med redskaber som VirtualDub, AviSynth, Avidemux og mange andre. Sidstnævnte er cross-platform, så den kender jeg noget til, mens de to førstnævte er Windows-baserede, et land, jeg sjældent betræder.

Jeg vil vove den påstand, at de fleste andre programmer kan lave MPEG2-film i bedre kvalitet end mjpegtools, bl.a. ved at bruge variabel bitrate og multipass-komprimering. Men her skilles vore veje, for jeg tør ikke eksperimentere med hele oplaget af DVD'er til Bathos for at finde ud af, om folks stationære afspillere kan klare f.eks. variabel bitrate. En ting har jeg lært gennem Bathos-produktionen, nemlig at man umuligt kan være beredt på hvor forskelligt udstyr der findes derude, hvad angår tolerance og afvigelser fra standarderne.

Men... Det lader til, at Windows-land er et godt sted at befinde sig for film-pirater. Om dette også gælder for muligheder for preprocessing er jeg ikke kvalificeret til at udtale mig om.

Kommentarer: