head og tail

Publiceret: 21. februar 2019 / Ændret: 6. marts 2019

Disse to kommander kan finde hoved og hale i filer, eller udelade hoved og hale – de er faktisk gode og simple hvis man kan huske hvorledes man kan angive antal linjer. Jeg har lavet et par eksempler som er gode at have ved hånden. Læs videre "head og tail"

Videoklip portræt/landskab

Publiceret: 7. februar 2019 / Ændret: 17. februar 2019

Mange personer optager video-klip med en mobil "på højkant", det vil sige 1080×1920 px, hvorimod et HD TV kører 1920×1080, altså bredt lige som et filmlærred – hvilket også er sådan de fleste mennesker opfatter omgivelserne 🙂

Nogle videoklip i portræt-format står med Rotation 90 i exif-data og fysisk 1920×1080, mendens andre (de fleste?) har 1080×1920 og Rotation 0. Desuden er der forskel på om afspillere/programmer læser og respekterer Rotations-tag i exif-data.

Det er mit indtryk at det er ret tilfældigt om et videoklip bliver vist med den rigtige orientering – dette i modsætning til fotos, hvor jeg synes der sjældent er problemer (undtaget med nogle digitale fotorammer).

Første del af denne post viser hvorledes jeg kan tilpasse videoer til mit TV, og derefter kommer der nogle generelle kommandoer.


Tilpasse problematiske videoer til mit tv.
Mit Samsung-TV (UE46H7005) kløjes ofte i det når jeg ser videoer på højkant. Hvis videoen er større end 1920 i bredden og/eller højere end 1080, kan mit TV ikke vise videoen.

Hvis det fysiske format er 1920×1080 med rotation 90, det vil sige portræt/højkant, virker det for nogle videoer – og for andre virker det ikke. Jeg har ikke kunnet finde ud af hvorfor det varierer.

Jeg konverterer nu alle .mov til .mpeg, roterer portræt fysisk og sætter exif-rotationen til nul samt ændrer størrelse til max 1920×1080. Endvidere bruger jeg codec h.264 samt tilføjer "_TV-kopi" til navnet. Det kan alt sammen ske i én behandling med ffmpeg.

Derved opnår jeg flere fordele, f.eks. at det (vist) virker for alle videoer, fil-størrelsen bliver mindre, og mit TV skal ikke bruge kræfter (og dermed tid) på at rotere eller resize videoen.

Det er sjovere at automatisere en proces end udføre den samme opgave mange gange 😉

Jeg bruger derfor nogle (ret lange) one-linere – der sker som skitseret her med kommentarer til kommandoerne.

Inden jeg går i gang med nedenstående sørger jeg for at ændre filnavne (dato som filnavn, store til små bogstaver mv.) som beskrevet i andre indlæg.


Find videoer, der ikke skal konverteres.
Først dannes en fil med de mp4-filer hvor rotation=0, og hvor størrelsen ikke overskrider 1920x1080px – disse .mp4-filer behøver ikke konvertering (jeg kopierer dem dog senere, så jeg har en kopi til TV-visning).

exiftool -q -s3 -if '$Rotation# eq 0' -if '$ImageWidth#<=1920' -if '$ImageHeight#<=1080' -FileName -ext mp4 . | sort > files2copy.txt

Finde videoer, der skal konverteres.
Denne kommando danner en fil med navne på alle .mov og .mp4 filer, undtagen dem der blev skrevet til filen i kommandoen ovenfor. Det vil sige alle .mov-filer (skal konverteres til .mp4), videoer, som skal formindskes til 1920×1080, eller som skal roteres fysisk i henhold til anført exif-data om rotation (rotation bliver automatisk sat til 0 så det passer sammen):

ls *.mov *.mp4 | grep -vf files2copy.txt > files2convert.txt

Tjekke rotation inden konvertering.
Normalt roterer ffmpeg en video uden problemer når der konverteres til et andet format – men det er ikke altid at kameraer håndterer og markerer portræt/landskab på en ordentlig måde, så andre programmer kan håndtere det.

Derfor udtrækker jeg et foto fra hver video anført i files2convert.txt – navnet på billedet bliver det oprindelige navn tilføjet _tmp.

De dannede tmp-fotos gennemses i min sædvanlige foto-viser. Hvis rotationen ikke passer på et foto, slettes det pågældende video-filnavn i files2convert.txt og medtages dermed ikke i automatikken, men skal konverteres manuelt fra kommandolinjen.

Udtræk af tmp-fotos:

while read -r f; do [[ -f "$f" ]] || continue; ffmpeg -nostdin -i "$f" -vframes 1  "${f%%.*}_tmp.jpg"; echo "*** "$f" - udført"; done < files2convert.txt

Denne kommando sletter tmp-fotos efter gennemgangen:

rm ./*_tmp.jpg

Konvertere og rotere
Tekstfilen files2convert.txt bruges som input til ffmpeg.

Der sker naturligvis en forringelse ved konverteringen, men med -crf 21 bliver det sjældent at se.

De nye filer får tilføjet "_TV-kopi" så de ikke forveksles med den originale, (høj)kvalitets-video.

new_w=1920; new_h=1080; while read -r f; do [[ -f "$f" ]] || continue; ffmpeg -nostdin -i "$f" -map_metadata 0 -filter:v scale=w="if(gt(dar\,${new_w}/${new_h})\,min(${new_w}\,iw*sar)\,2*trunc(iw*sar*oh/ih/2))":h="if(gt(dar\,${new_w}/${new_h})\,2*trunc(ih*ow/iw/sar/2)\,min(${new_h}\,ih))" -c:v libx264 -crf 21 -acodec copy "./${f%.*}_TV-kopi.mp4"; done < files2convert.txt

Kopiere ikke-konverterede videoer
Først tjekkes om der er problemer med rotation: Loop gennem videoerne i files2copy.txt - de stopper efter 1 sekund, hvorefter næste vises efter et tryk på ESC. Hvis der er nogle videoer, der ligger ned, fjernes pågældende filnavn i files2copy.txt, og videoen konverteres senere separat fra kommandolinjen.

while read -r f; do [[ -f "$f" ]] || continue; ffplay -noautorotate -x 800 -y 800 -t 1 "$f"; done < files2copy.txt

Dernæst kopieres de filer, der er anført i files2copy.txt:

while read -r f; do [[ -f "$f" ]] || continue; cp -n "$f" "./${f%.*}_TV-kopi.mp4"; done < files2copy.txt

Generelt gode kommandoer til manuel behandling.

Efterfølgende kommandoer er nogle generelle kommandoer, som jeg finder brugbare.

Det er vigtigt at holde sig for øje, at ændring af "rotate" ikke ændrer den fysiske orientering/rotering landskab/portræt, men kun exif-informationen "Rotation"!

Hvis der skal se en fysisk rotation, skal "transpose" anvendes i stedet.


Se dimension og rotation.
List ImageSize og Rotation for udvalgte filtyper:

exiftool -f -ImageSize -Rotation# -ext mp4 -ext mov . -csv

Nulstil "Rotation" uden re-encoding.
Denne kommando nulstiller rotation, men uden at ændre videoen - dvs. at videoen måske ligger ned når den afspilles:

ffmpeg -i input.mp4 -c copy -map_metadata 0 -metadata:s:v:0 rotate=0 output.mp4

Nulstil "Rotation" og roter fysisk (re-encode).
Argument -crf 21 angiver hvor høj kompression (interval 1-51) , der anvendes - husk at høj kompression = lavere kvalitet!

Crf på 18 giver en meget god kvalitet, default er 23, så jeg vælger 21 🙂 Argument -acodec copy kopierer lyden uden konvertering.

Normalt vil ffmpeg læse og følge exif-koden for Rotation - men hvis dette ikke ønskes skal der tilføjes -noautorotate som argument (kan sættes som første argument).

Denne one-liner klarer vist jobbet i de fleste tilfælde:

ffmpeg -i input.mp4 -map_metadata 0 -c:v libx264 -crf 21 -acodec copy output.mp4

Hvis videoen ligger ned (manglende exif-kode for rotation), skal der køres en "transpose". Der kan vælges mellem clock, cclock, vflip og hflip. Kan kombineres - en rotation på 180 grader kan klares med én af disse:
"transpose=clock,transpose=clock"
"transpose=vflip,transpose=hflip").

Denne drejer en kvart omgang med uret:

ffmpeg -i input.mp4 -map_metadata 0 -vf "transpose=clock" -c:v libx264 -crf 21 -acodec copy output.mp4

Ændre størrelse og evt. rotation.
Normalt vil orienteringen landskab/portræt passe eftersom ffmpeg læser og følger exif-koden for Rotation.

Tilpas videoen til en bredde på 1280, og behold proportionerne - højden på "-2" betyder højden skal være et multiplum af 2 af hensyn til det anvendte codec (libx264).

ffmpeg -i input.mp4 -map_metadata 0 -vf "scale=1280:-2" -c:v libx264 -crf 21 -acodec copy output.mp4

Sæt højde til 1080 (passer til mit HD TV), og behold proportioner.

ffmpeg -i input.mp4 -map_metadata 0 -vf "scale=-2:1080" -c:v libx264 -crf 21 -acodec copy output.mp4

Ændre filnavne upper/lower

Publiceret: 11. december 2013 / Ændret: 3. februar 2019

Ændring af filnavne/extension til kun store, eller kun små bogstaver, kan udføres med nogle (halv-lange) "one-linere". Eksemplerne virker også på filer med mellemrum i navnet. Der er sikret mod overskrivning af eksisterende filer på case-sensitive systemer (Ubuntu/Linux), hvor FOTO.jpg og FOTO.JPG ellers vil få samme filnavn. Læs videre "Ændre filnavne upper/lower"

Omdøbe filer

Publiceret: 5. december 2018 / Ændret: 30. januar 2019

Omdøbning af filer sker typisk med commandoen mv, men man kan også bruge kommandoen rename som dog ikke er standard i alle linux-versioner.

Jeg har samlet nogle eksempler på omdøbning af filer Læs videre "Omdøbe filer"