4. diel - Ffmpeg a transcoding - Rozlíšenie, Bitrate
V minulej lekcii, Ffmpeg a transcoding - Kontajner, Kodek , sme si ukázali ako zmeniť súborový kontajner (súborový formát) videa a audia a ako nastaviť kodek (komprimačný / dekompresor algoritmus). Dnes si predvedieme ako nastavovať vlastnosti kodeku, tzn. kvalitu a detaily. Jedná sa o kľúčové informácie audio / video stôp multimediálneho obsahu.
Dôležité pravidlo transcodingu: Z kvalitnejšieho videa / audia možno vždy vyrobiť video / audio stopu kvalitatívne rovnakú alebo horšie. Opačne to nefunguje. V tomto procese sa vždy informácie zachovajú alebo stráca. Nemožno teda vyrobiť z horšieho obrazu lepší, tzn. vyrobiť nové informácie.
Zmena rozlíšenia
Čo je rozlíšenie sme si už povedali a ukázali, ale pokojne to zopakujem. Ide o počet stĺpcov / riadkov na obrazovke. V prípade zmeny rozlíšenia možno prevádzať z vyššieho rozlíšenia do rovnakého alebo nižšieho. Samozrejme softvér (FFmpeg) nám umožní z 640x480 urobiť 4K (3840x2160), ale to neznamená, že video získa nové detaily a ostrosť. Okolo tejto problematiky existuje celkom slušná veda (lineárne / nelineárne / ... dopočty), ale tomu sa venovať nebudeme.
V našom príklade si vytvoríme z 4K (3840: 2160) videá video s
rozlíšením 720p, tzv. HDready (1280: 720). Zmenu rozlíšenia u video stopy
možno vykonávať cez filter (filtergraph) alebo cez veľkosť rámu (frames
size). V prípade filtrov sa robí parametrom
-vf scale=rozlišení
, v našom prípade bude parameter filtra
-vf scale=1280:720
alebo -filter:v scale=1280:720
. V
prípade veľkosti rámov sa používa parameter -s 1280x720
, tzv.
Frame size.
Zmena rozlíšenia cez filter
Ako prvý možnosť si predvedieme variantu cez filter. Kodek u audia ponecháme identický. Mimochodom, menšie rozlíšenie samozrejme zmení veľkosť súboru. Príkaz bude nasledujúci:
ffmpeg -i video.mp4 -vf scale=1280:720 -acodec copy video720p.mkv -hide_banner
Ak by sme chceli rozlíšenie 640: 480, príkaz bude vyzerať takto:
ffmpeg -i video.mp4 -vf scale=640:480 -acodec copy video640_480.mkv -hide_banner
Ako vidíte na výpise metadát na priloženom screenu, rozlíšenie video stopy sa zmenilo na 640x480. Veľkosť súboru sa zmenšila na cca 11 MB. Kodek zostal rovnaký, len drasticky poklesol bitový tok (bitrate).
Ak by ste chceli ponechať kópiu nastavenia kodeku a nové rozlíšenie, tak to vám FFmpeg neumožní. Zobrazí error s vysvetlením, že filtre a streamcopy nemožno využiť naraz.
ffmpeg -i video.mp4 -vcodec copy -vf scale=1280:720 -acodec copy video720p.mkv -hide_banner
Zmena rozlíšenia kombináciou kodeku a kvality videa
Druhá možnosť zmeny veľkosti rámov (frame size) je kombináciou kodeku a kvality videa:
ffmpeg -i video.mp4 -s 1280x720 -c:v libx265 -acodec copy videoFrameH265.mkv -hide_banner
Zmena pomeru strán
Osobne pomer strán nepoužívam, riešim všetko cez rozlíšenie, ale
FFmpeg samozrejme vie nastaviť aj pomer strán (aspect ratio) obrazu. Všetko
sa zadáva cez parameter -aspect hodnota:hodnota
.
Najpoužívanejšie pomery strán sú: 16: 9, 4: 3, 16:10, 5: 4, 2.21: 1, 2.35:
1, 2.39: 1.
Tu napríklad zmeníme video v pomere 16: 9 a audio kodek ponecháme:
ffmpeg -i video.mp4 -aspect 16:9 -acodec copy video.mkv -hide_banner
Samozrejme možno definovať kombináciu rozlíšenia a pomeru strán cez
filter, napr. Parameter setdar
. Pretože opäť používame filter,
nesmieme použiť -vcodec copy
:
ffmpeg -i video.mp4 -vf scale=640:480,setdar=4:3 -c:v libx265 -acodec copy video.mkv -hide_banner
V prípade, že chcete deformovaný obraz, môžete skúsiť parameter filtra
setsar
a hrať sa s pomerom sami:
ffmpeg -i video.mp4 -vf scale=640:480,setsar=1:1 -c:v libx265 -acodec copy video.mkv -hide_banner
Kvalita videa (bitrate)
Nastavenie kvality videa je možné vykonávať v FFmpeg niekoľkými spôsobmi. Pod pojmom kvalita videa je myslený tzv. Dátový tok (bitrate). Ten má zásadný vplyv na detaily. Doteraz sme ho nechávali na defaultu u kodeku, čo je niekedy celkom nevyhovujúci. Teraz si teda predvedieme, ako sa kvalita dátového toku dá nastaviť.
Faktor konštantné hodnoty
Prvý spôsob je faktor konštantné hodnoty (constant rate factor).
Parameter v FFmpeg je -crf hodnota
. Hodnota je číslo od
0
(najlepšia kvalita) do 51
(najhoršie kvalita).
Problémom tohto spôsobu je, že tento parameter nie je v každom kodeku v
FFmpeg podporovaný. Avšak v prípade napr. H264, H265 podporovaný je.
Vykonáme prevod do H265 (hevc) s najhoršími detaily
-crf 51
:
ffmpeg -i video.mp4 -c:v libx265 -crf 51 -preset veryfast -acodec copy videoCRF51.mkv -hide_banner
Zaiste ste si všimli novo pridaného parametra -preset
. Tento
parameter určuje rýchlosť kódovania. Platí úmera čím rýchlejší / tým
horšie kompresie. Takže ak máte v pláne lepšiu kompresiu (malú veľkosť
súboru) a konštantnú bitovú hĺbku (bitrate), je vhodnejšie pomalší
verzia parametra. Možnosti nastavenia sú ultrafast
/
superfast
/ veryfast
/ faster
/
fast
/ medium
/ slow
/
slower
a ak daný parameter nenastavíte, potom je defaultom
medium
. Mimochodom, nie každý kodek tento parameter podporuje,
napr. Kodeky h264, H265 áno.
Keď si video pustíme, tak uvidíte, že kvalita je skutočne otrasná.
Rozlíšenie zostalo rovnaké, dátový tok (bitrate) klesol na cca 800 kbit /
s. Pre istotu si vyskúšame aj maximálnu kvalitu s parametrom
-crf 0
:
ffmpeg -i video.mp4 -c:v libx265 -crf 0 -preset veryfast -acodec copy videoCRF0.mkv -hide_banner
Môžete si všimnúť, že bitrate vzrástol až na 420 000 kbit / sa výsledný súbor je cez 2GB. A to je až príliš. Odporúča sa používať hodnotu tak medzi 18 až 28.
Teraz si predvedieme prevod do rozlíšenia 720pHD (1280: 720) s prevodom do H265 (HEVC) as 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
Rozlíšenie sa upravilo a bitrate sa nastavil na hodnotu 2560 kbit / s:
Nastavenie konštantnej hodnoty bitrate
Druhý spôsob ja osobne považujem za lepší. Ide o nastavenie konštantnej
hodnoty dátového toku (bitrate). Nastavenie dátového toku (bitrate, preto je
parameter -b
) pri videu sa vykonáva -b:v hodnota
au
audia -b:a hodnota
. U videa je možné ho nastaviť v kilobitoch
-b:v 2000K
alebo megabitoch -b:v 2M
. Framework toto
dokáže rozlíšiť a video v danom dátovom toku spracuje. Pri transcodingu
možno vidieť, že hodnota dátového toku je približná a niekedy je vyššia
alebo nižšia (hovoríme, že osciluje okolo definovanej hodnoty + - pár
percent).
V tomto príklade vykonáme zmenu súborového kontajnera z mp4 na mkv, zmenu video kodeku na H265 s dátovým tokom 3000 kbit / s, a zmenu audio kodeku na mp3 s dátovým tokom 192 kbit / sek:
ffmpeg -i video.mp4 -c:v libx265 -b:v 3000K -c:a mp3 -b:a 192K video3000K.mkv
výsledok:
Samozrejme najvhodnejšie sa môže javiť variant kombinácia zhoršenia rozlíšenie a zníženie dátového toku. Ak by sme chceli upraviť dátový tok vo video a audio stope ako v predchádzajúcom prípade + zmenšiť rozlíšenie, vykonáme 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 naštudovaní týchto existujúcich kapitol by ste mali byť úspešní v základných operáciách pri prevádzaní vašich multimediálnych súborov. Ďalšie kapitoly budú riešiť prakticky podružné špeciality. V budúcej lekcii sa pozrieme na Ffmpeg a transcoding - Strihanie, skladanie, výrezy .