Er zijn veel open-sourcetools voor het bewerken, aanpassen en converteren van multimedia in precies wat je nodig hebt. Tools als Audacity of Handbrake zijn fantastisch, maar soms wil je gewoon snel een bestand van het ene formaat in het andere omzetten. Enter FFmpeg.
FFmpeg is een verzameling van verschillende projecten om met multimedia bestanden om te gaan. Het wordt vaak gebruikt achter de schermen in veel andere media-gerelateerde projecten. Ondanks zijn naam heeft het niets te maken met de Moving Picture Experts Group of de talloze multimedia formaten die het heeft gemaakt.
In dit artikel zal ik FFmpeg gebruiken via het command-line gereedschap ffmpeg, dat slechts een klein onderdeel is van het FFmpeg project. Het is beschikbaar op veel verschillende besturingssystemen en wordt standaard meegeleverd met sommige besturingssystemen. Het kan worden gedownload van de FFmpeg website of via de meeste package managers.
FFmpeg is een krachtig gereedschap dat bijna alles kan doen wat je je maar kunt voorstellen met multimedia bestanden. In dit artikel zijn we geïnteresseerd in het gebruik om bestanden te converteren, dus we zullen niet diep ingaan op alle mogelijkheden van het programma. Voordat we FFmpeg gaan gebruiken, moeten we eerst even kijken wat een mediabestand precies is.
Mediabestanden
Op een heel hoog niveau gezien, is een mediabestand opgedeeld in een container en zijn streams. De streams bevatten de eigenlijke AV-componenten, zoals de audio of video van een film, en zijn gecodeerd met een bepaalde mediacodering, of codec. Elke codec heeft zijn eigen eigenschappen, sterke en zwakke punten. De FLAC-codec is bijvoorbeeld goed voor verliesvrije audio van hoge kwaliteit, terwijl Vorbis is ontworpen om qua bestandsgrootte te concurreren met MP3, maar een betere audiokwaliteit te bieden. Dit betekent dat een FLAC-geformatteerd bestand veel groter zal zijn dan een Vorbis-audiostream, maar beter zou moeten klinken. Geen van beide is inherent beter dan de ander, omdat beide verschillende dingen proberen te doen.
De container is het omhulsel voor de streams. Het presenteert een enkele interface waarmee mediaspelers en gereedschappen kunnen communiceren. Sommige containers zijn zeer geavanceerd en maken elke soort stream mogelijk, inclusief meerdere video- en audiostreams binnen een enkele container. De streams in een container hoeven echter niet alleen audio of video te zijn. Verschillende containers laten verschillende streams toe, bv. ondertitels, hoofdstukinformatie, of andere metadata. Het hangt allemaal af van wat de container toestaat.
Dit is een abstracte weergave van mediabestanden en gaat voorbij aan veel verschillen tussen containers. Vele vereisen bepaalde streams en metadata of leggen beperkingen op aan de toegestane codecs of inhoud. Deze uitleg is genoeg om door dit artikel te komen. Om meer te weten te komen, klik op de links hierboven.
Wees je ervan bewust dat video en audio codering een zeer lange tijd kan duren om te draaien. Je moet bereid zijn om een tijdje te wachten als je FFmpeg gebruikt.
Basis conversie
Het ding dat de meeste mensen struikelt als het gaat om het converteren van audio en video is het selecteren van de juiste formaten en containers. Gelukkig is FFmpeg erg slim met zijn standaard instellingen. Meestal selecteert het automatisch de juiste codecs en container zonder ingewikkelde configuratie.
Een voorbeeld: je hebt een MP3 bestand en je wilt dat converteren naar een OGG bestand:
ffmpeg -i input.mp3 output.ogg
Dit commando neemt een MP3 bestand genaamd input.mp3 en converteert het naar een OGG bestand genaamd output.ogg. Vanuit het oogpunt van FFmpeg betekent dit dat de MP3 audio stream wordt omgezet in een Vorbis audio stream en dat deze stream in een OGG container wordt gewikkeld. Je hoeft geen stream- of containertypes op te geven, want FFmpeg heeft het voor je uitgezocht.
Dit werkt ook met video’s:
ffmpeg -i input.mp4 output.webm
Omdat WebM een goed gedefinieerd formaat is, weet FFmpeg automatisch welke video en audio het kan ondersteunen en zal de streams converteren naar een geldig WebM-bestand.
Afhankelijk van de container van je keuze, zal dit niet altijd werken. Bijvoorbeeld, containers zoals Matroska zijn ontworpen om bijna elke stream die je erin wilt stoppen aan te kunnen, of ze nu geldig zijn of niet. Dit betekent dat het commando:
ffmpeg -i input.mp4 output.mkv
kan resulteren in een bestand met dezelfde codecs als input.mp4 had, wat al dan niet is wat je wilt.
Selecteer je codecs
Dus wat doe je als je een container zoals Matroska wilt gebruiken (die bijna elke stream aankan) maar toch invloed wilt hebben op welke codecs er in de output zitten? FFmpeg biedt redding! Je kunt de benodigde codecs selecteren door de -c vlag te gebruiken.
Met deze vlag kun je voor elke stream de verschillende te gebruiken codec instellen. Om bijvoorbeeld de audio stream in te stellen als Vorbis, zou je het volgende commando gebruiken:
ffmpeg -i input.mp3 -c:a libvorbis output.ogg
Hetzelfde kan worden gedaan om zowel de video als de audio stream te veranderen:
ffmpeg -i input.mp4 -c:v vp9 -c:a libvorbis output.mkv
Dit zal een Matroska container maken met een VP9 video stream en een Vorbis audio stream, in wezen hetzelfde als de WebM die we eerder hebben gemaakt.
Het commando ffmpeg -codecs zal elke codec printen die FFmpeg kent. De uitvoer van dit commando zal veranderen afhankelijk van de versie van FFmpeg die u hebt geinstalleerd.
Veranderen van een enkele stream
Meer vaak dan u zou willen, is het bestand dat u hebt gedeeltelijk correct met slechts een enkele stream in het verkeerde formaat. Het kan erg tijdrovend zijn om de juiste stream opnieuw te encoderen. FFmpeg kan in deze situatie helpen:
ffmpeg -i input.webm -c:v copy -c:a flac output.mkv
Dit commando kopieert de video stream van input.webm naar output.mkv en codeert de Vorbis audio stream naar een FLAC. De -c vlag is echt krachtig.
Veranderen van een container
Het voorgaande voorbeeld kan worden toegepast op zowel de audio- als de videostreams, zodat u van het ene containerformaat naar het andere kunt converteren zonder extra stream-encodering te hoeven doen:
ffmpeg -i input.webm -c:av copy output.mkv
Beïnvloeden van de kwaliteit
Nu we de codecs onder de knie hebben, is de volgende vraag: Hoe stellen we de kwaliteit van elke stream in?
De eenvoudigste methode is het veranderen van de bitrate, wat al dan niet tot een andere kwaliteit kan leiden. Het vermogen van de mens om te zien en te horen is niet zo zuiver en duidelijk als we zouden willen denken. Soms maakt het veranderen van bitrate een enorm verschil voor de subjectieve kwaliteit. Andere keren doet het niets, behalve de bestandsgrootte veranderen. Soms is het erg moeilijk te zeggen wat er zal gebeuren zonder het uit te proberen.
Om de bitrate van elke stream in te stellen, gebruik je de -b vlag, die op een vergelijkbare manier werkt als de -c vlag, behalve dat je in plaats van codec opties een bitrate instelt.
Om bijvoorbeeld de bitrate van de video te veranderen, zou je het als volgt gebruiken:
ffmpeg -i input.webm -c:a copy -c:v vp9 -b:v 1M output.mkv
Dit kopieert de audio (-c:a copy) van input.webm en converteert de video naar een VP9 codec (-c:v vp9) met een bit rate van 1M/s (-b:v), alles gebundeld in een Matroska container (output.mkv).
Een andere manier om de kwaliteit te beïnvloeden is om de frame rate van de video aan te passen met de -r optie:
ffmpeg -i input.webm -c:a copy -c:v vp9 -r 30 output.mkv
Dit creëert een nieuwe Matroska met de audio stream gekopieerd en de video stream frame rate geforceerd op 30 frames per seconde, in plaats van gebruik te maken van de frame rate van de input (-r 30).
Je kunt ook de afmetingen van je video aanpassen met FFmpeg. De eenvoudigste manier is om een vooraf bepaalde video grootte te gebruiken:
ffmpeg -i input.mkv -c:a copy -s hd720 output.mkv
Dit wijzigt de video naar 1280×720 in de uitvoer, maar je kunt de breedte en hoogte handmatig instellen als je wilt:
ffmpeg -i input.mkv -c:a copy -s 1280x720 output.mkv
Dit produceert exact dezelfde uitvoer als het eerdere commando. Als je aangepaste afmetingen in FFmpeg wilt instellen, onthoud dan dat de breedte parameter (1280) voor de hoogte (720) komt.
Het aanpassen van frame rate en bitrate zijn twee ruwe maar effectieve technieken om de kwaliteit van de media te beïnvloeden. Door deze waarden zeer hoog in te stellen kan de kwaliteit van een bestaande bron niet worden verbeterd als de kwaliteit al laag is.
Het wijzigen van deze instellingen is het meest effectief voor het snel verkleinen van een hoogwaardige stream om een kleinere bestandsgrootte te maken. Het aanpassen van de grootte van uw video kan de kwaliteit niet verbeteren, maar kan ervoor zorgen dat het beter past op een tablet in plaats van uw TV. Het veranderen van de grootte van een 640×480 video naar 4K zal het niet verbeteren.
Het veranderen van de kwaliteit van je bestanden is een zeer subjectieve zaak, wat betekent dat er niet één manier is die elke keer zal werken. De beste methode is om wat veranderingen aan te brengen en te testen of het er voor u beter uitziet of beter klinkt.
De streams aanpassen
Vaak heeft u een bestand dat bijna perfect is, en hoeft u er alleen maar een paar stukjes af te knippen. Dit kan gemakkelijker worden gedaan met een tool die laat zien wat je verandert, maar als je precies weet waar je het bijgesneden wilt hebben, is het heel gemakkelijk om het in FFmpeg te doen:
ffmpeg -i input.mkv -c:av copy -ss 00:01:00 -t 10 output.mkv
Dit kopieert de video en audio streams (-c:av copy) maar trimt de video. De -t optie stelt de duur van het knippen in op 10 seconden en de -ss optie stelt het beginpunt van de video in voor het knippen, in dit geval op één minuut (00:01:00). U kunt nauwkeuriger zijn dan alleen uren, minuten en seconden, tot op de milliseconde indien nodig.
Uitpakken van de audio
Soms geeft u niet echt om de video, u wilt alleen de audio. Gelukkig is dit heel eenvoudig in FFmpeg met de -vn vlag:
ffmpeg -i input.mkv -vn audio_only.ogg
Dit commando extraheert alleen de audio van de invoer, codeert het als Vorbis, en slaat het op in audio_only.ogg. Nu hebt u een geïsoleerde audio stream. U kunt ook de -an en -sn vlaggen op dezelfde manier gebruiken om audio en ondertitel streams te strippen.
Een GIF van maken
De laatste tijd hebben geanimeerde GIFs (met een harde g want ik ben geen monster) een comeback gemaakt. Persoonlijk vind ik GIF het slechtste formaat dat je voor video kunt kiezen. Het heeft een verschrikkelijke compressie kwaliteit en grootte; heeft zeer harde limieten rond kleuren, frame rates, en container metadata; en kan geen audio ondersteunen. Toch is het heel populair. Dus, hoe kun je van een videoclip een geanimeerde GIF maken?
De -an vlag gebruiken, zoals we hierboven hebben gedaan, is beter dan een geanimeerde GIF maken als je een video zonder audio wilt maken, maar er zijn genoeg plaatsen die GIFs ondersteunen die geen ander video formaat zullen ondersteunen. Voor al diegenen:
ffmpeg -i input.mkv output.gif
Dit commando maakt een GIF met dezelfde afmetingen als het invoerbestand. Dit is vaak een slecht idee, omdat GIFs niet goed comprimeren in vergelijking met andere videoformaten (in mijn ervaring wordt een GIF ongeveer acht keer groter dan de bronvideo). Het kan nuttig zijn om de -s optie te gebruiken om je GIF te verkleinen, vooral als de bron vrij groot is, zoals HD video.
Andere tools
Hoewel FFmpeg de go-to tool is voor de meeste AV taken, is het niet perfect voor alles. Er zijn enkele tools die, gebruikt in combinatie met FFmpeg, alles een beetje gemakkelijker kunnen maken.
Video’s van YouTube halen
Het kan heel gemakkelijk zijn om iets naar YouTube te uploaden, de originele bronvideo te verliezen, en alleen de YouTube-versie over te houden. Wat is de makkelijkste manier om een kopie van je YouTube video’s terug te krijgen?
Youtube-dl is een handig klein programma dat je kunt gebruiken om video’s van YouTube en andere video-streaming diensten te halen. Het is heel eenvoudig te gebruiken:
youtube-dl https://www.youtube.com/watch?v=2m5nW9CQLJ0
Dit commando download de video op de aangegeven URL en slaat hem lokaal op.
Youtube-dl heeft verschillende opties om de kwaliteit en het formaat van de gedownloade video te regelen, maar ik vind het makkelijker om het bovenstaande commando te gebruiken. Het download de hoogste kwaliteit audio en video in een enkel bestand, dan gebruik ik FFmpeg om ze te converteren in het formaat dat ik wil.
Informatie krijgen over de media
Soms is alles wat je moet weten wat er in de media container zit. Er zijn verschillende programma’s die dit kunnen, maar mijn voorkeur gaat uit naar MediaInfo. MediaInfo toont alle informatie in een media container, voor elk van de verschillende streams, evenals de metadata voor het invoerbestand. Dit geeft je alles wat je zou willen weten – en waarschijnlijk een heleboel dingen die je niet wist.
Het uitvoeren van het commando mediainfo inputFile.mkv spuugt een lijst uit met informatie over het invoerbestand in een door mensen leesbare vorm.
En meer…
Dit is nog maar een tipje van de sluier van wat FFmpeg kan doen. Gelukkig is de documentatie voor FFmpeg en de andere tools van het project erg goed en de moeite waard om te bekijken. Je leert er alles over de vele trucjes die deze hond kan.
Als je op zoek bent naar een tool met een grafische interface voor het converteren van multimedia, dan is Handbrake een uitzonderlijk goede die beschikbaar is op Linux, Mac OS X, en Windows. Handbrake gebruikt FFmpeg (naast andere tools) onder de motorkap.