Lekce 4 - FFmpeg a transcoding - Rozlišení, Bitrate
V minulé lekci, FFmpeg a transcoding - Kontejner, Kodek, jsme si ukázali jak změnit souborový kontejner (souborový formát) videa a audia a jak nastavit kodek (komprimační/dekomprimační algoritmus).
Dnes si předvedeme jak nastavovat vlastnosti kodeku, tzn. kvalitu a detaily. Jedná se o klíčové informace audio/video stop multimediálního obsahu.
Důležité pravidlo transcodingu: Z kvalitnějšího videa/audia lze vždy vyrobit video/audio stopu kvalitativně stejnou nebo horší. Opačně to nefunguje. V tomto procesu se vždy informace zachovají nebo ztrácí. Nelze tedy vyrobit z horšího obrazu lepší, tzn. vyrobit nové informace.
Změna rozlišení
Co je rozlišení jsme si již řekli a ukázali, ale klidně to zopakuji. Jedná se o počet sloupců/řádků na obrazovce. V případě změny rozlišení lze převádět z vyššího rozlišení do stejného nebo nižšího. Samozřejmě software (FFmpeg) nám umožní z 640x480 udělat 4K (3840x2160), ale to neznamená, že video získá nové detaily a ostrost. Kolem této problematiky existuje docela slušná věda (lineární/nelineární/... dopočty), ale tomu se věnovat nebudeme.
V našem příkladu si vytvoříme z 4K (3840:2160) videa video s
rozlišením 720p, tzv. HDready (1280:720). Změnu rozlišení u video stopy lze
provádět přes filtr (filtergraph) nebo přes velikost rámu (frames size). V
případě filtrů se provádí parametrem -vf scale=rozlišení
, v
našem případě bude parametr filtru -vf scale=1280:720
nebo
-filter:v scale=1280:720
. V případě velikosti rámů se
používá parametr -s 1280x720
, tzv. frame size.
Změna rozlišení přes filtr
Jako první možnost si předvedeme variantu přes filtr. Kodek u audia ponecháme identický. Mimochodem, menší rozlišení samozřejmě změní velikost souboru. Příkaz bude následující:
ffmpeg -i video.mp4 -vf scale=1280:720 -acodec copy video720p.mkv -hide_banner
Pokud bychom chtěli rozlišení 640:480, příkaz bude vypadat takto:
ffmpeg -i video.mp4 -vf scale=640:480 -acodec copy video640_480.mkv -hide_banner
Jak vidíte na výpisu metadat na přiloženém screenu, rozlišení video stopy se změnilo na 640x480. Velikost souboru se zmenšila na cca 11 MB. Kodek zůstal stejný, pouze drasticky poklesl bitový tok (bitrate).

Pokud byste chtěli ponechat kopii nastavení kodeku a nové rozlišení, tak to vám FFmpeg neumožní. Zobrazí error s vysvětlením, že filtry a streamcopy nelze využít naráz.
ffmpeg -i video.mp4 -vcodec copy -vf scale=1280:720 -acodec copy video720p.mkv -hide_banner
Změna rozlišení kombinací kodeku a kvality videa
Druhá možnost změny velikosti rámů (frame size) je kombinací kodeku a kvality videa:
ffmpeg -i video.mp4 -s 1280x720 -c:v libx265 -acodec copy videoFrameH265.mkv -hide_banner
Změna poměru stran
Osobně poměr stran nepoužívám, řeším vše přes rozlišení, ale
FFmpeg samozřejmě umí nastavit i poměr stran (aspect ratio) obrazu. Vše se
zadává přes parametr -aspect hodnota:hodnota
.
Nejpoužívanější poměry stran jsou: 16:9, 4:3, 16:10, 5:4, 2.21:1, 2.35:1,
2.39:1.
Zde například změníme video v poměru 16:9 a audio kodek ponecháme:
ffmpeg -i video.mp4 -aspect 16:9 -acodec copy video.mkv -hide_banner
Samozřejmě lze definovat kombinaci rozlišení a poměru stran přes filtr,
např. parametr setdar
. Protože opět používáme filtr, nesmíme
použít -vcodec copy
:
ffmpeg -i video.mp4 -vf scale=640:480,setdar=4:3 -c:v libx265 -acodec copy video.mkv -hide_banner
V případě, že chcete deformovaný obraz, můžete zkusit parametr filtru
setsar
a hrát si s poměrem sami:
ffmpeg -i video.mp4 -vf scale=640:480,setsar=1:1 -c:v libx265 -acodec copy video.mkv -hide_banner
Kvalita videa (bitrate)
Nastavení kvality videa lze provádět v FFmpeg několika způsoby. Pod pojmem kvalita videa je myšlen tzv. datový tok (bitrate). Ten má zásadní vliv na detaily. Doteď jsme jej nechávali na defaultu u kodeku, což je někdy docela nevyhovující. Nyní si tedy předvedeme, jak se kvalita datového toku dá nastavit.
Faktor konstantní hodnoty
První způsob je faktor konstantní hodnoty (constant rate factor). Parametr
v FFmpeg je -crf hodnota
. Hodnota je číslo od 0
(nejlepší kvalita) do 51
(nejhorší kvalita). Problémem tohoto
způsobu je, že tento parametr není v každém kodeku v FFmpeg podporován.
Nicméně v případě např. h264, h265 podporován je.
Provedeme převod do h265 (hevc) s nejhoršími detaily
-crf 51
:
ffmpeg -i video.mp4 -c:v libx265 -crf 51 -preset veryfast -acodec copy videoCRF51.mkv -hide_banner
Zajisté jste si všimli nově přidaného parametru -preset
.
Tento parametr určuje rychlost kódování. Platí úměra čím
rychlejší/tím horší komprese. Takže pokud máte v plánu lepší kompresi
(malou velikost souboru) a konstantní bitovou hloubku (bitrate), je
vhodnější pomalejší verze parametru. Možnosti nastavení jsou
ultrafast
/superfast
/veryfast
/faster
/fast
/medium
/slow
/slower
a pokud daný parametr nenastavíte, pak je defaultem medium
.
Mimochodem, ne každý kodek tento parametr podporuje, např. kodeky h264, h265
ano.

Když si video pustíme, tak uvidíte, že kvalita je skutečně otřesná.
Rozlišení zůstalo stejné, datový tok (bitrate) klesl na cca 800 kbit/s. Pro
jistotu si vyzkoušíme i maximální kvalitu s parametrem
-crf 0
:
ffmpeg -i video.mp4 -c:v libx265 -crf 0 -preset veryfast -acodec copy videoCRF0.mkv -hide_banner
Můžete si všimnout, že bitrate vzrostl až na 420 000 kbit/s a výsledný soubor je přes 2GB. A to je až příliš. Doporučuje se používat hodnotu tak mezi 18 až 28.
Nyní si předvedeme převod do rozlišení 720pHD (1280:720) s převodem do h265 (HEVC) a s nastavením CRF 28:
ffmpeg -i video.mp4 -c:v libx265 -crf 28 -preset veryfast -vf scale=1280:720 -acodec copy video720CRF28.mkv -hide_banner
Rozlišení se upravilo a bitrate se nastavil na hodnotu 2560 kbit/s:

Nastavení konstantní hodnoty bitrate
Druhý způsob já osobně považuji za lepší. Jedná se o nastavení
konstantní hodnoty datového toku (bitrate). Nastavení datového toku
(bitrate, proto je parametr -b
) u videa se provádí
-b:v hodnota
a u audia -b:a hodnota
. U videa je
možné jej nastavit v kilobitech -b:v 2000K
nebo megabitech
-b:v 2M
. Framework toto dokáže rozlišit a video v daném
datovém toku zpracuje. Při transcodingu lze vidět, že hodnota datového toku
je přibližná a někdy je vyšší nebo nižší (říkáme, že osciluje
kolem definované hodnoty +- pár procent).
V tomto příkladu provedeme změnu souborového kontejneru z mp4 na mkv, změnu video kodeku na h265 s datovým tokem 3000 kbit/s, a změnu audio kodeku na mp3 s datovým tokem 192 kbit/sec:
ffmpeg -i video.mp4 -c:v libx265 -b:v 3000K -c:a mp3 -b:a 192K video3000K.mkv
Výsledek:

Samozřejmě nejvhodnější se může jevit varianta kombinace zhoršení rozlišení a snížení datového toku. Pokud bychom chtěli upravit datový tok ve video a audio stopě jako v předchozím případě + zmenšit rozlišení, provedeme to takto:
ffmpeg -i video.mp4 -s 1280x720 -c:v libx265 -b:v 3000K -c:a mp3 -b:a 192K videoOBE.mkv -hide_banner
Po nastudování těchto stávajících kapitol byste měli být úspěšní v základních operacích při převádění vašich multimediálních souborů. Další kapitoly budou řešit prakticky podružné speciality.
V příští lekci se podíváme na FFmpeg a transcoding - Stříhání, skládání, výřezy.