IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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).

zmena rozlíšenia - Úprava audio a video súborov pomocou frameworku FFmpeg

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.

Úprava rozlíšení CRF - Úprava audio a video súborov pomocou frameworku FFmpeg

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:

Úprava rozlíšenia CRF - Úprava audio a video súborov pomocou frameworku FFmpeg

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:

Info - Úprava audio a video súborov pomocou frameworku FFmpeg

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 .


 

Predchádzajúci článok
Ffmpeg a transcoding - Kontajner, Kodek
Všetky články v sekcii
Úprava audio a video súborov pomocou frameworku FFmpeg
Preskočiť článok
(neodporúčame)
Ffmpeg a transcoding - Strihanie, skladanie, výrezy
Článok pre vás napísal Robert Michalovič
Avatar
Užívateľské hodnotenie:
1 hlasov
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