Veel meer commando’s in Terminal!
In het vorige artikel kwam een handige truc voorbij om content van Youtube te downloaden m.b.v. het Terminal scherm. Elke Apple computer die draait op Mac OS (en dus niet IOS van je iPhone) heeft een Terminal beschikbaar. In dit artikel komen een berg tool en commando’s voorbij die ik zelf veel gebruik.
Homebrew applicaties
Onderstaande applicaties installeer ik doorgaans wel als ik een nieuwe Mac voor mijn neus heb.
# YouTube downloader:
brew install youtube-dl
# Video converter:
brew install ffmpeg
# AAC audio encoder/decoder:
brew install fdk-aac
# MKV video's bewerken:
brew install mkvtoolnix
# ISO/VideoTS naar MKV converter:
Brew install makeMKV
# Ondertitel extractor:
brew install ccextractor
# Subsync (Synchroniseren van ondertitels):
brew install nodejs
brew install subsync
# O.a. om meta-data (van afbeeldingen) te bewerken:
brew install exiftool
# IRC Terminal client (messenger tool):
brew install weechat
Veel van bovenstaande applicaties hebben betrekking op het bewerken van video / audio / afbeeldingen. Het kan zijn dat je zelf je video collectie wilt optimaliseren of dat je de applicaties gebruikt om content voor te bereiden voor publicatie op het web. En deze twee voorbeelden zijn precies waarvoor ik ze gebruik 😉
CONVERSIES & COMPRIMEREN
# Verander alleen extensie (remux)(Maakt kopie en is snel):
ffmpeg -i input.mov -c copy output.mp4
# of:
ffmpeg -i input.mp4 -c copy output.mkv
# Verander formaat (slechtere kwaliteit? + duurt lang):
ffmpeg -i input.mov output.mp4
# Converteer en comprimeer naar MP4 met H264 codec
# H264 is geschikt voor browsers.
# 28 is de mate van compressie. 32 is nog meer compressie:
ffmpeg -i input.mp4 -vcodec libx264 -crf 28 output.mp4
# Converteer en comprimeer naar MP4 met H265 codec
# Niet geschikt voor browsers en dus voor het web
# H265 is veel efficiënter dan zijn voorganger H264:
ffmpeg -i input.mp4 -vcodec libx265 -crf 25 output.mp4
# Converteer een AVI naar een MKV:
ffmpeg -fflags +genpts -i input.avi -c:v copy -c:a copy output.mkv
Elke video die ik online zet (niet op Youtube) wil ik zo min mogelijk kilobytes laten hebben. Hier gebruik ik dus de H264 codec voor. Door met de mate van compressie te spelen bepaal ik de beeldkwaliteit/compressie-verhouding. In bovenstaande voorbeeld is dat mogelijk door het getal 28 te verhogen voor meer compressie en te verlagen voor minder compressie.
Voor mijn persoonlijke filmcollectie heb ik andere eisen. Als ik een film toevoeg aan mijn collectie dan wil ik dat hij voldoet aan de volgende eisen:
- Bestandsformaat *.MKV
- Compressie codec H265
- Audioformaat AC3 5.1 of DTS 5.1
- Audiokanaal in oorspronkelijke taal. Geen andere talen.
- V.b. van de naam van het audiokanaal: “DTS 5.1 – [Engels]”
- Één ondertitel in het Nederlands. Geen anderen talen.
- V.b. van de naam van het ondertitel-kanaal: “Dutch – [Nederlands]”
- Het ondertitel bestand ingesloten in de *.MKV
- Exotische, niet originele ondertitels verwijderd.
- Metadata titel heeft de naam en jaar van de film, vb. “Aladin (2019)”
Door in de naam van het audiokanaal op te geven of we te maken hebben met 2.0 (stereo) of 5.1 (surround) weet ik zonder te luisteren al wat ik kan verwachten. Om al deze punten voor elkaar te krijgen in Terminal zijn er meer commando’s nodig. Hieronder staat een lijst waarmee je al deze zaken kunt doen.
MP4 bewerken
# Voeg een cover afbeelding toe:
ffmpeg -i input.mp4 -i image.png -map 1 -map 0 -c copy -disposition:0 attached_pic output.mp4
# Voeg een titel toe:
ffmpeg -i input.mp4 -metadata Title=“Photoshop Tutorial” -codec copy output.mp4
MKV Info opvragen
# Vraag MKV tracks op:
mkvmerge -i input.mkv
# Vraag meer MKV tracks op:
mkvinfo input.mkv
Audio
# Extract audio track 1 van MKV, in mp3 formaat:
mkvextract tracks input.mkv 1:audio.mp3
# Voeg audio samen met MKV file (let op: bestaande audio tracks worden verwijderd):
mkvmerge -o output.mkv -A input.mkv audio.aac
# Verwijder all audio tracks maar bewaar enkele (track 3 & 4):
mkvmerge -o output.mkv --atracks 3,4 input.mkv
# Geef het standaard audio track op (track 3)
mkvpropedit input.mkv --edit track:a1 --set flag-default=0 --edit track:a2 --set flag-default=0 --edit track:a3 --set flag-default=1
# Geef de taal/naam op van een audio track.
# Eng, Dut, Jap | a1=1ste audio track, s1=1ste sub track:
mkvpropedit input.mkv --edit track:a1 --set language=eng
mkvpropedit input.mkv --edit track:a1 --set language=eng --set name="AAC-2.0"
mkvpropedit input.mkv --edit track:a1 --set language=eng --set name="AC3-2.0"
mkvpropedit input.mkv --edit track:a1 --set language=eng --set name=“MP3-2.0"
mkvpropedit input.mkv --edit track:a1 --set language=eng --set name="DTS-5.1"
mkvpropedit input.mkv --edit track:a1 --set name="DTS 5.1"
mkvpropedit input.mkv --edit track:a1 --set name="AC3 2.0"
mkvpropedit input.mkv --edit track:a1 --set name="MP3 2.0"
mkvpropedit input.mkv --edit track:a1 --set name="AC3 5.1"
Ondertitels
Ondertitels komen in verschillende formaten. Het liefst werk ik met *.srt files. Deze kun je eenvoudig openen met een gratis programma zoals Aegisub. (download). De workflow die kan voorkomen is:
- Haal een ondertitel track uit een *.mkv en sla op als *.srt file.
- Open de *.srt file met Aegisub.
- Verwijder ongewenst elementen en of voeg nieuwe teksten toe.
- Sla de gewijzigde *.srt file op en voeg deze weer samen met de *.mkv.
- Verwijder bij het samen voegen alle overige ondertitels.
Als je een ondertitel in een ander formaat hebt dan *.srt kunnen er zich verschillende problemen voordoen. ifo, vob, idx hebben niet mijn voorkeur. Een video waar de ondertitels hard in de pixels zijn gebrand al helemaal niet. Meestal ga ik dan opzoek naar een andere video of zoek zelf de *.srt ondertitels op. Ondertitels kun je o.a. vinden op opensubtitles.org
# Extract ondertitel track (nr4) uit MKV:
mkvextract tracks input.mkv 4:out.srt
# Ondertitels hard in file branden:
ffmpeg -i input.mkv -vf subtitles=input.srt output.mp4
# Verschuif de hele ondertitel met 5,33 seconden:
subsync @+5:33 < input.srt > out.srt
# Verschuif vanaf het begin met 1,40 sec. & aan eind met +20,55 sec.:
subsync @+1:40 @+20:55 < input.srt > out.srt
# Begin bij 0 sec. geleidelijk in te korten naar -4,5 sec. op 1 uur, houdt het daar tot het einde:
subsync @+0 1:00:00-4:5 < input.srt > out.srt
# Verwijder alle ondertitel tracks:
mkvmerge -o output.mkv --no-subtitles input.mkv
# Verwijder uit een MKV alle ondertitels en voeg zelf een Nederlandse ondertitel toe:
mkvmerge -o out.mkv --no-subtitles input.mkv --language 0:nl input.srt --title Nederland
# Verander de track naam van Subtitle track
mkvpropedit input.mkv --edit track:s1 --set language=dut --set name=Dutch
Titel
De titel van een film is handig om goed op te geven. Zo gebruik ik een App op mijn Apple TV genaamd ‘Infuse‘. Deze App kan video’s streamen vanaf een NAS. Het mooie van deze App is dat hij meta-data van de film online kan ophalen. Zo haalt hij van themoviedb.org verschillende dingen van de film op zoals:
- Cover
- Omschrijving van de film
- Waardering van de film (opgegeven door andere gebruikers)
- Regisseurs
- Acteurs
Om deze meta-data goed op te kunnen halen is het belangrijk dat de bestandsnaam / title goed is en overeenkomt met de betreffende film op de website van themoviedb.org
# Titel veranderen van een MKV
mkvpropedit input.mkv -e info -s title="The Tree of Life (2011)"
Cover afbeelding
# Voeg cover afbeelding toe aan MKV
ffmpeg -i input.mkv -c copy -attach image.jpg -metadata:s:t \mimetype=image/jpeg output.mkv
DVD omzetten naar mkv
# Converteer *.ISO naar *.mkv
makemkvcon mkv iso:./input.iso all .
# Converteer Video_TS folder naar mkv
makemkvcon mkv file:./VIDEO_TS/ all .
Trim of splitsen van mkv
# Video in stukken hakken:
# 1ste deel? Alleen de duur opgeven!
ffmpeg -t 00:23:48 -i input.mkv -vcodec copy -acodec copy output.mkv
# 2de deel? Starttijd + duur opgeven!
ffmpeg -ss 00:23:49 -t 00:23:47 -i input.mkv -vcodec copy -acodec copy output.mkv
# 3de deel? Alleen starttijd opgeven!
ffmpeg -ss 01:11:12 -i input.mkv -vcodec copy -acodec copy output1.mkv
Video’s samenvoegen
# Video’s samenvoegen
ffmpeg -i "concat:1.mkv|2.mkv|3.mkv" -c copy output.mkv
# Syntax txt-file met bestandsnamen om samen te voegen
file './001.mkv'
file './002.mkv'
file './003.mkv'
file './004.mkv'
file './005.mkv'
# txt-file in folder om samen te voegen
ffmpeg -f concat -safe 0 -i mylist.txt -c copy out.mkv
Roteren van video
# transpose 0 = 90gr. tegen klok in + flip verticaal
# transpose 1 = 90gr. met klok mee
# transpose 2 = 90gr. tegen klok in
# transpose 3 = 90gr. met klok mee + flip verticaal
ffmpeg -i input.mp4 -vf "transpose=1" out.mp4
Met bovenstaande code voorbeelden kun je in je terminal snelle en krachtige handelingen uitvoeren op video’s. Het is dus zeker niet altijd nodig om kostbare videobewerking software aan te schaffen. Bovendien vind ik het helmaal niet prettig om Adobe Premiere of Apple Final Cut Studio op te starten. Deze applicaties zijn traag en gewichtig. Ze claimen veel resources van je machine.
Als je veel video bestanden tegelijk wilt aanpassen kan dat natuurlijk met Adobe Media Encoder. Maar vanzelfsprekend kunnen we dat ook in terminal m.b.v. een script. Hierover meer in een volgend artikel.