Lekce 3 - FFmpeg a transcoding - Kontejner, Kodek
V minulé lekci, FFprobe - Analýza multimediálních souborů, jsme si ukázali, jak získat klíčové informace o audio/video stopách multimediálního souboru a vysvětlili si co vlastně znamenají.
Nyní nás čeká samotná úprava (transcoding) multimediálních souborů.
V případě transcodingu se kódování/dekódování děje automaticky mimo naši kontrolu. FFmpeg dle parametrů příkazu pozná, jestli je překódování nutné či nikoli. Předvedeme si zejména úpravu video obsahu, protože ten zabírá většinou 90-95% obsahu souborového kontejneru. Vše si předvedeme na videu, které jsme si stáhli v minulé lekci z uloz.to. Samozřejmě si lze příklady zkoušet i na vašich videích, např. z telefonů, digitálních kamer apod.
Změna souborového kontejneru (souborového formátu)
Jak jsme si uvedli v první lekci, existuje nepřeberné množství souborových kontejnerů, jenž slouží jako úložiště pro multimediální obsah. Zde na tomto odkazu lze zjistit jaké souborové formáty jsou v FFmpeg podporovány. Jak vidíte, množství formátů k dekódování (vstupy) je skutečně obrovské. Počet souborových kontejnerů ke kódování (výstup) již tak ohromný není. Nicméně ty nejznámější podporované jsou např. Matroska (.mkv), Avi (.avi), Flash video (.flv), Ogg (.ogg), Mpeg (.mpeg), MP4 (.mp4) apod.. Samozřejmě si je nutné nejdříve ověřit, jestli je vámi požadovaný kontejner v FFmpeg podporován, ať se jedná o dekódování/kódování, než začnete něco zkoušet. Dále upozorním: neplatí, že každý souborový kontejner podporuje všechny kodeky. Může nastat situace, kdy FFmpeg ukončí svou práci s tím, že vámi zvolený kontejner nepodporuje, nebo kontejner nepodporuje vámi zvolený kodek.
Změna formátu z mp4 na mkv
Pro začátek si předvedeme, jak změníme souborový formát z *.mp4 na *.mkv. V tomto případě se konverze souborového kontejneru provede včetně kódování/dekódování defaultně nastavenými kodeky i s jejich parametry v FFmpeg:
ffmpeg -i video.mp4 video.mkv -hide_banner
Mě osobně nikdy jejich defaultní nastavení nevyhovovalo.

Pokud porovnáme vstupní a výstupní soubor, pak si všimneme, že došlo ke zmenšení velikosti souboru z 234MB na 191 MB. Po prohlídce výpisu je jasné, že to bylo způsobeno změnou bitrate (hustotou datového toku) z 43 MB na 35MB. Dále byl změněn audio kodek z AAC na vorbis.

Asi nejvýhodnější řešení je ponechat nastavení audio i video kodeku
vč. hustoty datového toku na stejné úrovni. Tím se zajistí stejná kvalita
videa i audia jako v předchozím kontejneru. Nicméně vzniká riziko, že
daný kodek nemusí být ve zvoleném souborovém kontejneru podporován.
Ponechání nastavení zajistíme přidáním dvou parametrů pro video kodek
-vcodec copy
a audio kodek -acodec copy
:
ffmpeg -i video.mp4 -vcodec copy -acodec copy videoNEW.mkv -hide_banner
Protože v tomto případě nedochází k dekódování/kódování, je transcoding velmi rychlý. Jak vidíte, kodek u audia zůstal stejný, hodnota datového toku je identická:

Změna kodeku (komprimačního algoritmu) u videa/audia
V této části si předvedeme, jak se mění typ kodeku. Opět je to
podobné, jako když měníme typ souborového kontejneru. Nejdříve
ověříme, jestli FFmpeg podporuje daný kodek, viz. seznam
podporovaných video kodeků pro zdrojový soubor. Také je nutné ověřit,
jestli souborový kontejner podporuje multimediální stopu vámi vybraného
kodeku. Pokud to nezjistíte v dokumentaci, pak to jednoduše zkuste přes
příkaz ffmpeg
a pokud proces spadne, pak daná kombinace
nefunguje (tato varianta je rychlejší, než studium dokumentace).
Námi zvolený soubor máme v h264 a aac. Změníme jej (transcodujeme) do h265 (HEVC) a mp3. Kvalitu bitrate ponecháme na defaultu pro dané kodeky. Protože měníme kodeky, automaticky dochází k dekódování a kódování, což nějakou dobu trvá. Dále připomínám, abyste si mohli pouštět filmy s libovolnými kodeky na počítači, musíte mít dané kodeky nainstalovány. A pokud je chcete pouštět v TV, set-top-boxech, satelitních receiverech, DVD (blu-ray) přehrávačích, atd., je nutné, aby dané zařízení tento kodek podporovalo.
Pro změnu kodeku použijeme buď tento příkaz:
ffmpeg -i video.mp4 -vcodec libx265 -acodec mp3 videoH265.mkv -hide_banner
Nebo můžeme použít i druhé označení kodeku hevc
:
ffmpeg -i video.mp4 -vcodec hevc -acodec mp3 videoH265.mkv -hide_banner
Alternativně lze pro definici kodeku použít i parametr
-c:v kodek
, kde:
-c
říká FFmpeg, že se jedná o definici kodeku,:v
říká FFmpeg, že se jedná o video akodek
je definice (označení) kodeku.
Příkaz by tedy byl:
ffmpeg -i video.mp4 -c:v libx265 -acodec mp3 videoH265.mkv -hide_banner
A výsledek:

Jak vidíte, video se zkonvertovalo. Opět proveďte výpis přes
ffprobe
. Soubor se nám zmenšil na cca 115 MB, defaultní
nastavení snížilo u videa datový tok na cca 21 Mb/s a u audia došlo ke
snížení datového toku na 128 kb/s.
Zjištění označení kodeku
Problémem může být zjistit název parametru, kterým
FFmpeg označíme daný typ kodeku. V příkladu výše jste si
mohli všimnout, že pro stejný kodek dokonce existují dva parametry a to
libx265
a hevc
. Abyste zjistili zkratku pro vybraný
kodek, existuje příkaz:
ffmpeg -codecs
Najděte svůj vybraný kodek. V příkladu si vybereme video kodek MPEG-4
Microsoft verzi 3, jeho označení msmpeg4v3
. DE
ve výpisu označuje, že jej lze dekódovat (Decode) / kódovat
(Encode), takže pokud bychom jej chtěli využít, pak příkaz bude
vypadat takto:
ffmpeg -i video.mp4 -vcodec msmpeg4v3 -acodec mp3 videoMPEG4vv3.mkv -hide_banner
Označení nejrozšířenějších kodeků
Pro příklad si uvedeme pár nejrozšířenějších kodeků. Nemám je všechny otestované, sám kóduji jen do h264, příp. h265 (hevc). Ani mpeg4 nepoužívám. Pokud je někde v závorce napsáno testováno, sám jsem tento kodek otestoval.
Typ kodeku (Rozšířený název) | FFmpeg parametr |
---|---|
h264 (testováno) | libx264 |
h265 (testováno) | libx265 |
Xvid (testováno) | libxvid |
MPEG-1 video (testováno) | mpeg1video |
MPEG-2 video (testováno) | mpeg2video |
MPEG-4 (testováno) | mpeg4 |
VP8 (testováno) | libvpx |
Google VP9 (testováno) | libvpx-vp9 |
Windows Media Video 7 | wmv1 |
Windows Media Video 8 (testováno) | wmv2 |
Windows Media Video 9 | wmv3 |
Podpora kodeků souborovými kontejnery
Dá se říci, že největší problém je prakticky vědět, který souborový kontejner (formát) podporuje jaké kodeky (video i audio kompresní algoritmy). Jednou z možností je cesta pokusu/omylu a další např. přes docela přehlednou tabulku, kde jsou zohledněny nejznámější kontejnery a kodeky. Nejsou tam uveřejněny všechny, ale jako odrazový můstek v orientaci vám to pomůže.
V příští lekci, FFmpeg a transcoding - Rozlišení, Bitrate, se budeme zabývat změnou rozlišení a bitrate.