Tips en Trucs 2010

Video en audio bewerken met FFmpeg

Je hebt juist een dure hoofdtelefoon gekocht. Je zet hem op, start uw favoriete afspeellijst, zakt weg in uw sofa, drukt op Play. En uw muziek klinkt even slecht als op uw oude goedkope hoofdtelefoon. Uw hoofdtelefoon is wel degelijk beter, maar de muziek klinkt niet goed omdat de muziek niet naar optimale kwaliteit gecodeerd is.

Met coderen bedoelen we het omzetten van informatie van het ene formaat naar een ander formaat. Bij het rippen van de audio CD's, heb je gecodeerd naar MP3 waardoor de muziekbestanden klein zijn. Ze zijn zo klein omdat de codering veel informatie verwijderde om de bestanden zo klein mogelijk te houden. Dit was in de vervlogen dagen van dure schijfruimte en beperkte internet snelheden een aanvaardbaar compromis.

Met de komst van tera schijven, kan je zonder problemen 100 GB ruimte aanwenden voor uw muziekcollectie, waardoor je de geluidskwaliteit gevoelig kunt verbeteren. En met de beste codeer hulpmiddelen in de softwarebronnen van uw distributie, heb je enkel wat geduld nodig om uw muziek en films te laten klinken als nooit tevoren. Zelf op het kleine USB jog-podje.

Welke hulpmiddelen hebben we nodig?

Je kan audio en video op verschillende manieren coderen en op verschillende manieren verpakken. Daarnaast zijn er per regio en per opslagmedium verschillende standaarden. Je kan je daarbij afvragen of er een hulpmiddel bestaat die al die verschillende normen combineert. FFmpeg is zo'n hulpmiddel en kan audio en video lezen en omzetten. Het meeste werk wordt daarbij verricht door de libavcodec bibliotheek. De meeste open source media spelers maken dan ook gebruik van enkele daarop gebaseerde programma's.

De twee populairste FFmpeg alternatieven zijn Mencoder en Transcode. Alles wat we in deze tip tonen, kan dus ook door deze twee hulpmiddelen uitgevoerd worden. Mencoder is een onderdeel van de media speler MPlayer en wordt gebruikt in de AcidRip DVD ripper. Transcode wordt gebruikt in dvd::rip. Zowel Mencoder en Transcode gebruiken de FFmpeg libavcodec bibliotheek.

Door zijn enorme afhankelijkheid van andere pakketten installeer je FFmpeg het best via een softwarebron voor uw distributie. Wie met openSUSE werkt, kan terecht bij de softwarebron Packman, officiele openSUSE softwarebronnen bieden enkel beperkte versies aan (bepaalde onderdelen zijn geen open source, rusten patenten op of mogen niet zonder toelating verdeeld worden). Hoewel je FFmpeg kan gebruiken om muziek te coderen, zoals je zal zien bij het afzonderen van het geluidsspoor in films, gebruik je daar beter specifieke hulpmiddelen voor. Nu je toch aan het installeren bent, installeer je cdparanoia, FLAC, OggEnc (een onderdeel van vorbis-tools) en het Lame codeerhulpmiddel.

Muziek

Als je muziek wilt coderen om te archiveren, gebruik je best de codeerder FLAC. De met FLAC gecodeerde muziek, levert grote bestanden op maar bewaard alle muziekinformatie zonder kwaliteitsverlies. Deze FLAC gecodeerde muziek kan dan als basis dienen voor de verlieslatende formaten die we op de afspeelapparaten gaan gebruiken.

Vorbis is een goede keuze om live te streamen met software zoals Icecast. De meeste muziek spelers kunnen vandaag OGG bestanden afspelen. Als je MP3's nodig hebt, kan je ze coderen met Lame.

Om te beginnen gaan we een audio CD rippen en ongecomprimeerd zonder verlies opslaan in het WAV formaat. Er bestaan veel open source CD rippers, en uw distributie heeft er zeker één.

Werk je liever met de opdrachtregel, gebruik dan de opdracht
cdparanoia 7 track7.wav
om spoor 7 van de audio CD te lezen en op te slaan in het bestand track7.wav. Het geluid van een DVD kan je met de volgende opdracht afzonderen:
mplayer dvd://1 -ao pcm:file=intro.wav
waarmee het eerste geluidsspoor van de DVD wordt opgeslagen.

Wat je ook gebruikte, je hebt nu een ongecomprimeerd WAV bestand om te coderen. FFmpeg kan audio stromen coderen, maar andere hulpmiddelen klaren de klus beter.

Om naar FLAC te coderen, gebruik je
flac track7.wav
Daarbij wordt het bestand track7.flac met een standaard compressie aangemaakt. Dit bestand is ongeveer half zo groot als het WAV bestand. De compressie is instelbaar van -0 (snelle compressie) tot -8 (beste compressie) met -5 als standaard compressie.

Op dezelfde manier kan je van het WAV of FLAC bestand een OGG bestand afleiden
oggenc track7.flac
Dit maakt zelfs met de standaard kwaliteit een zeer klein bestand aan. Als uw Vulcan oren niet onder de indruk zijn van de kwaliteit, schakel je de maximale kwaliteit in met het -q10 argument

En nu het klassieke MP3:
lame -h -V 6 track7.wav track7.mp3
creëert een MP3 met een variabele bitrate. De kwaliteit is instelbaar tussen 0 en 9, waarbij een lager getal een groter en kwalitatief betere MP3 oplevert. Met behulp van het jokerteken * kan je de volledige collectie met één opdracht omzetten. Deze hulpmiddelen kunnen metadata lezen en deze gebruiken om automatisch bestandsnamen aan te maken.

Naast de kwaliteit kan je ook het aantal kanalen en de bemonsteringsfrequentie instellen. In sommige gevallen is mono geluid te verkiezen boven stereo. Beide stereokanalen kan je samenvoegen met het argument -C 1.

Hoewel ik specifieke hulpmiddelen heb aangeraden, kan je evengoed coderen met FFmpeg. FFmpeg gebruikt daarbij dezelfde bibliotheken:
ffmpeg -i intro.wav -acodec libmp3lame -ac 1 -ar 22050 -ab 64k intro.mp3
Hier vragen we FFmpeg om het WAV bestand te coderen met behulp van de Lame MP3 codeerder. Door het gebruik van slechts 1 kanaal (-ac 1) (mono), een bemonsteringsfrequentie van 22.050 Hz en een bitrate van 64 k zal het bestand klein zijn.

FFmpeg ondersteunt een enorm aantal formaten. Om een idee te krijgen, voer je de opdracht ffmpeg -formats uit.

Bestanden onderzoeken

Voor we verder gaan is het belangrijk te weten hoe je video en audio bestanden met FFmpeg kunt onderzoeken. Het bestand Copying_Is_Not_Theft_H264_720p.mov kan je als volgt onderzoeken:
ffmpeg -i Copying_Is_Not_Theft_H264_720p.mov

FFmpeg version UNKNOWN, Copyright (c) 2000-2010 the FFmpeg developers
  built on Mar  4 2010 07:35:00 with gcc 4.4.1 [gcc-4_4-branch revision 150839]
  configuration: --shlibdir=/usr/lib --prefix=/usr --mandir=/usr/share/man --libdir=/usr/lib --enable-shared --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libfaad --enable-libfaac --enable-nonfree --enable-libxvid --enable-postproc --enable-gpl --enable-x11grab --enable-libschroedinger --enable-libdirac --enable-libgsm --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libdc1394 --enable-pthreads
  libavutil     50. 9. 0 / 50. 9. 0
  libavcodec    52.55. 0 / 52.55. 0
  libavformat   52.54. 0 / 52.54. 0
  libavdevice   52. 2. 0 / 52. 2. 0
  libswscale     0.10. 0 /  0.10. 0
  libpostproc   51. 2. 0 / 51. 2. 0

Seems stream 1 codec frame rate differs from container frame rate: 47952.00 (47952/1) -> 23.98 (2997/125)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Copying_Is_Not_Theft_H264_720p.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 537199360
    compatible_brands: qt
  Duration: 00:00:59.64, start: 0.000000, bitrate: 13800 kb/s
    Stream #0.0(eng): Audio: pcm_s16le, 48000 Hz, 1 channels, s16, 768 kb/s
    Stream #0.1(eng): Video: h264, yuv420p, 1280x720, 13029 kb/s, 23.98 fps, 23.98 tbr, 23976 tbn, 47952 tbc
At least one output file must be specified

Let op de regels die beginnen met 'Stream'. Deze bevatten informatie over de video en audio stromen.

Je hebt deze informatie nodig om de stromen te beheren. Soms gebruik je ze zoals ze zijn, soms codeer je ze naar een ander formaat. Het is een goede gewoonte om voor het coderen van video en audio bestanden deze bestanden eerst te onderzoeken.

Video's uitkleden

Als je een natuursite dat beetje extra sfeer wilt geven, kan je de muziek van een natuurfilm gebruiken. In MPlayer kan je het geluid met het argument -vo null uitschakelen. Maar wat als je een film wilt ontdoen van het soms storende geluid.

Met FFmpeg kan je het geluid uit de video halen. Eerst onderzoek je het videobestand om te achterhalen in welk formaat de audio in de video decodeerd werd. Het bestand SpiritOfTheOutback.mov bevat de volgende audio stroom: 'Stream #0.1(eng): Audio: aac, 44100 Hz, stereo, s16, 130 kb/s'.

Zonder het geluid af met de opdracht
ffmpeg -i SpiritOfTheOutback.mov -vn -acodec copy natuur.aac
Met het -vn argument vertellen we FFmpeg dat we de beelden niet nodig hebben. Daarna gebruiken we de audio codec copy, wat FFmpeg de opdracht geeft de originele codering met de originele instellingen te gebruiken.

Scholen plaatsen tegenwoordig video's van de lessen op het internet. Je kan dezelfde techniek gebruiken om het geluid van de films af te zonderen. Het afgezonderde geluid kan daarna op een audio CD geplaatst worden. Volg daarbij wel de richtlijnen uit de Red Book audio CD standaard:
ffmpeg -i 0101\ -\ Introduction\ to\ Linux.mov -vn -acodec pcm_s16le -ar 44100 -ac 2 introduction.wav
Het resultaat is een ongecomprimeerd twee-kanaals geluid met een 16-bits bemonstering en 44.100 Hz bemonsteringsfrequentie. Om enkel de beelden uit een video te halen, gebruik je de opdracht:
ffmpeg -i SpiritOfTheOutback.mov -an -vcodec copy SpiritOfTheOutback_stil.mov
Het -an argument is de tegenhanger van -vn en zorgt ervoor dat FFmpeg het geluid negeert. FFmpeg zal door het argument copy codec de originele codering voor de beelden overnemen.

Films op het internet plaatsen

Na het schieten van wat beelden met uw handycam, wil je anderen laten genieten van de opgenomen beelden. De camera kan uw filmpjes niet op YouTube plaatsen. FFmpeg kan dit wel door uw opgenomen filmpjes om te zetten naar het voor YouTube geschikte videoformaat:

Mijn camera produceert MPEG video's en ik codeer ze voor YouTube met:
ffmpeg -i MOV0010.mpg -ar 22050 -acodec libmp3lame -ab 32K -r 25 -s 320x240 -vcodec flv werkzaamheden.flv
We coderen naar de voorschriften van YouTube met de FLV codec. Naast de reeds besproken audio argumenten gebruiken we een aantal nieuwe argumenten. Het argument -r bepaalt het aantal beelden per seconde, dit is voor PAL 25 en voor NTSC 29,97 (afhankelijk van de regio). Uiteindelijk herschalen we met het argument -s de video naar een grootte van 320x240. Je kan deze werkwijze voor alle online video diensten gebruiken, zolang je maar weet aan welke specificaties de video's moeten voldoen.

Het argument -t gebruik je om een video te knippen. Een voorbeeld: -t 10 zal de eerste 10 seconden coderen. Je kan met het argument -ss naar een bepaalde positie in de video springen. Een voorbeeld:
ffmpeg -i MOV0010.mpg -acodec copy -r 25 -s 320x240 -vcodec flv -ss 00:10:00 -t 128 werkzaamheden.flv
Dit codeert 128 seconden video na het overslaan van de eerste 10 minuten. Je kan de tijd voor zowel -t als -ss opgeven in seconden of in het uu:mm:ss formaat. Handig als je niet telkens wilt vermenigvuldigen met 60.

Als je meer belang hecht aan de bestandsgrootte dan aan de lengte van de video, gebruik je het argument -fs. Een voorbeeld: -fs 10485760 zal coderen tot het videobestand 10 MB groot is.

Let wel op dat -fs niet de volledige video in de gevraagde bestandsgrootte zal plaatsen. Het zorgt ervoor dat het bestand nooit groter kan worden dan de opgegeven waarde, m.a.w. de video wordt afgebroken als de opgegeven bestandsgrootte bereikt wordt.

TV kwaliteit

Een video coderen met TV kwaliteit is een stuk eenvoudiger. Voor PAL-landen gebruik je:
ffmpeg -i MOV0010.mpg -target pal-vcd auditie.mpg
Het argument -target pal-vcd verzorgt alle instellingen (bitrate, codec selectie). Er zijn heel wat vooraf ingestelde configuraties om te gebruiken, zoals NTSC DVD, of de klassieke VCD, DVD, DV, enz. Deze zijn handig om vakantie en familie films te delen met familie en vrienden.

Er is nog een factor waarmee je rekening moet houden - de beeldverhouding. Mijn camera neemt standaard op in 4:3 formaat en bij breedbeeld opnames in het 16:9 formaat. In het 4:3 formaat hebben de video's een afmeting van 320x240. Je kan met het reeds besproken argument -s de video herschalen, maar dan zit je met vervormde voorwerpen en ronde hoofden krijgen een ei vorm.

Deze vervormingen krijg je niet als je de video bijsnijdt tot het 16:9 formaat. Een 320x240 video moet dus bijgesneden worden tot 320x[320/(16/9)] of 320x180. Er moeten dus 60 beeldpunten afgeknipt worden:
ffmpeg -i MOV0010.mpg -croptop 30 -cropbottom 30 -padtop 30 -padbottom 30 -padcolor 000000 -target ntsc-dvd gecentreerd.mpg
Dit knipt 30 beeldpunten boven- en onderaan af, en plaats er zwarte banden. De kleur van de banden bepaal je met hexadecimale waarden (zoals in HTML documenten). Om een 16:9 video naar het 4:3 formaat om te zetten, knip je met de argumenten -cropright en -cropleft de video rechts en links wat bij.

Beeld en geluid synchroniseren

Door al dat bewerken onstaat wel eens een video waar het geluid en de beelden niet synchroon lopen. Om dit te herstellen scheiden we de audio en video stroom van elkaar om deze dan met een vertraging terug samen te voegen.

Eerst scheiden we de stromen:
ffmpeg -i auditie.mpg -vcodec copy auditie.m1v -acodec copy auditie.mp2
We krijgen zo twee stromen opgeslagen in aparte audio en video containers (bestanden). Om de vertraging ten opzichte van de andere stroom in te stellen, gebruik je het argument -itsoffset. Meestal gebruik je een vertraging uitgedrukt in milliseconden. Veronderstel dat er 10,2 seconden vertraging op het geluid zit, m.a.w. je hoort de knal pas nadat de slechterik naar de held schoot.
ffmpeg -i auditie.mp2 -itsoffset 00:00:10.2 -i auditie.m1v knalerop.mpg
Dit voegt de twee stromen terug samen, waarbij de beelden 10,2 seconden later starten. In het tegenovergestelde geval, waarbij de woorden in het gesprek al hoorbaar zijn voor ze uitgesproken zijn, kan je de audio vertraagd t.o.v de beelden starten. Indien het verschil tussen de twee stromen 3 milliseconden is:
ffmpeg -i auditie.m1v -itsoffset 00:00:00.3 -i auditie.mp2 lipsynchroon.mpg