Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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í/de­komprimač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í/neli­neá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).

Zmena rozlišení - Úprava audio a video souborů pomocí frameworku FFmpeg

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.

Úprava rozlišeni CRF - Úprava audio a video souborů pomocí frameworku FFmpeg

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:

Úprava rozlišení CRF - Úprava audio a video souborů pomocí frameworku FFmpeg

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:

Info - Úprava audio a video souborů pomocí frameworku FFmpeg

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.


 

Předchozí článek
FFmpeg a transcoding - Kontejner, Kodek
Všechny články v sekci
Úprava audio a video souborů pomocí frameworku FFmpeg
Přeskočit článek
(nedoporučujeme)
FFmpeg a transcoding - Stříhání, skládání, výřezy
Článek pro vás napsal Robert Michalovič
Avatar
Uživatelské hodnocení:
3 hlasů
Programuji převážně v Javě SE,EE a trochu nativním C a CUDA. více viz.https://cz.linkedin.com/in/robert-michalovic
Aktivity