7. diel - Ffmpeg a transcoding - Obrázky
Ak chceme získať obrázok (snímku obrazovky) z videa, je to samozrejme ľahké. Prvý spôsob je pokúsiť sa využiť OS a klávesy PrintScreen. Týmto spôsobom sa obrázok nahrá do pamäte OS a je k dispozícii cez skratku Ctrl + V. Takto ľahko ho môžeme presunúť napr. Do Maľovanie alebo nejakého iného nástroja. Avšak nie vždy to funguje. Samozrejme aj FFmpeg podporuje získavanie obrázkov z videa. Avšak upozorňujem, že je to nástroj prevažne pre transconding videa a prípadne audia. Podpora obrázkov je skôr symbolická.
Podporované formáty
Samozrejme sú podporované najznámejšie formáty obrázkov ako
*.jpg, *.bmp a *.png. Vo väčšine
prípadov sú u obrázkov súborové kontajnery (formáty) identické is kodeky,
ale napr. U rodiny súborového formátu JPEG to tak nie je. Tu je zoznam podporovaných
obrázkových formátov alebo možno využiť opäť výpis FFmpeg:
ffmpeg -codecs
Samozrejme je nutné overiť, či FFmpeg podporuje ako dekódovanie, tak i kódovanie daného formátu obrázku. V niektorých prípadoch vie len dekódovať či naopak kódovať. V tabuľke nižšie si uvedieme súborové kontajnery, u ktorých sú podporované oba varianty:
| typ kontajnera | FFmpeg parameter |
|---|---|
| TIFF - Tagged Image File - nie je plne podporovaný | tiff |
| PNG - Portable Network Graphics | png |
| GIF - Graphics Interchange Format | gif |
| JPEG - Joint Photographic Experts Group (nie je plne podporovaný) | MJPEG alebo JPEG2000 alebo jpegls |
| SGI RGB image format | SGI |
| Microsoft BMP image | bmp |
| Portable Bitmap image | PBM |
Získanie samostatného obrázku je úplne jednoduché. Ak chceme obrázok JPEG, robí sa to týmto príkazom:
ffmpeg -i video.mp4 -ss 00:00:10.000 -vframes 1 obrazek.jpg
Ak budeme chcieť obrázok formátu PNG, tak týmto príkazom:
ffmpeg -i video.mp4 -ss 00:00:10.000 -vframes 1 obrazek.png
Poďme si vysvetliť parametre príkazu:
-ss 00:00:10.000- špecifikuje okamih (čas) vo video stope, ktorý chceme ako obrázok-vframes 1- koľko obrázkov chcemeobrazek.jpg- názov súboru a typ kontajnera (obrázkový formát)
výsledok:

Ako vidíte, obrázok sme získali.
Vlastné kodek a bitrate obrázku
Spôsob vyššie funguje, ale neumožňuje nám nastavovať kodek a bitrate. Prezrieme si teda vlastnosti obrázku cez FFprobe:
ffprobe -i obrazek.jpg
Vidíme, že obrázok má preddefinovaný kodek (v tomto prípade MJPEG) aj hodnotu bitrate. Výhodou je, že s týmito preddefinovanými vlastnosťami vám defaultne pôjde obrázok otvoriť, ale ak si začnete nastavovať špecifické kodeky, potom je OS nemusí podporovať a obrázky otvorte snáď len v osobitných programoch.
Avšak ak chceme získať obrázok v inom kodeku rodiny JPEG, napr. JPEG2000, postup je nasledujúci:
ffmpeg -i video.mp4 -ss 00:00:10.000 -c:v jpeg2000 -vframes 1 obrazekJPG2000.jpg
Moje Windows 10 obrázok neobjavila, ale ffmpeg nevypísala žiadnu chybu. Zobrazenie cez FFplay fungovalo, aj keď to trochu dlhšie trvalo:
ffplay -i obrazekJPG2000.jpg
Získanie viac obrázkov
Ak by ste chceli získať viac obrázkov za sebou, je nutné použiť tento príkaz:
ffmpeg -i video.mp4 -ss 00:00:10.000 -vframes 10 obra%04d.jpg
Parameter -vframes 10 definuje počet obrázkov, ktoré chceme
získať. Ak je ich viac ako 1, samozrejme musíme zabezpečiť,
aby sa obrázky uložili do samostatných súborov. To urobíme pridaním
dodatočného reťazce výstupného obrázku %04d. Tento parameter
vytvorí obrázky s názvami od obra0001.jpg,
obra0002.jpg, ... až do obra0010.jpg.
Časový rozdiel medzi obrázkami
Ak chceme definovať časový rozdiel medzi obrázkami, je nutné použiť
parameter -vf fps=cas:
ffmpeg -i video.mp4 -vf fps=1/4 -vframes 5 obraN%04d.jpg
Parameter fps (Frame Per Second) určuje počet obrázkov za
sekundu. Hodnota 1 teda uloží obrázok každú sekundu videa. Ak
chceme uložiť obrázok napr. Každé 4 sekundy, zadáme hodnotu
1/4. Celkom teda budeme mať 5 obrázkov každé 4 sekundy.
Obrázok výrezu videa
Ak by sme chceli získať obrázok z videa cez výrez (teda odstrániť oblasti, ktoré v obrázku nechceme), potom príkaz bude vyzerať takto:
ffmpeg -i 1.mp4 -filter:v "crop=920:720:250:100" -ss 00:00:45.000 -vframes 1 obrazek.jpg
Opäť pripomeniem, že obrázok bude rozmere 920 (šírka) na
720 (výška). Súradný systém [0,0] je opäť v ľavom hornom
rohu a obrázok teda bude začínať 250 pixelov zľava a 100 pixelov z
vrchu.
Vloženie obrázku do videa
Toto už sú špecialitky. Vami zvolený obrázok (ja si vyberiem ikonu
FFmpeg uloženú v súbore icon.png) vložíte do videa. Opäť
pripomínam, že filtre nemožno naraz používať sa streamcopy. Príkaz je
nasledujúci:
ffmpeg -i video.mp4 -i icon.png -filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" -pix_fmt yuv420p videoObrazek.mp4
Poďme si vysvetliť parametre:
overlay=25:25:- ľavý horný roh obrázku sa umiestni25pixelov zľava a25pixelov zhora v obrazu videa. [0: 0] je vľavo hore.enable='between(t,0,20)'- obrázok bude vo videu v čase od00:00:00do00:00:20.

Vloženie videa do videa
Tak ako sme v predchádzajúcom príklade do horného ľavého rohu vložili obrázok (logo), nie je problém tam podobným spôsobom vložiť i video. Napr. vložíme rozlíšenie 320: 240 od nášho 4K videa. Najskôr si takéto mikrovideo s malým rozlíšením vyrobíme:
ffmpeg -i video.mp4 -vf scale=320:240 -an video320_240.mkv -hide_banner
Potom ho do 4K videa vložíme cez mapu:
ffmpeg -i video.mp4 -i video320_240.mkv -filter_complex "[1:v]setpts=1*PTS[a]; [0:v][a]overlay=25:25:enable='between(t,0,20)':shortest=1[out]" -map [out] -map 0:a -c:v libx264 -crf 25 -pix_fmt yuv420p -c:a copy videoVideo.mkv -hide_banner
Parametrov je veľa, poďme si ich opísať:
[0:v]- pole vstupov začína nulou, takže sa jedná o definíciu video streamu zo súboruvideo.mp4[1:v]setpts=1*PTS[a]- video stream zvideo320_240.mkvbude byť normálny priebeh, 1sec = 1 sec, <1 zrýchľuje video,> 1 spomaľuje videooverlay=25:25:- ľavý horný roh videa sa umiestni25pixelov zľava a25pixelov zhora v obrazu videa. [0: 0] je vľavo hore.enable='between(t,0,20)'- vložené mikrovideo bude vo videu v čase od00:00:00do00:00:20.

Export videa do gifu
Súborový formát .gif slúži väčšinou ako pohyblivý
obrázok na webe. Často sa používa ako banner. Na toto je asi najvhodnejší
a najpodrobnejšie návod tu.
Avšak pár príkladov si uvedieme. Len pripomeniem, že vzniknutý
*.gif je nutné otvoriť napr. Z prehrávača alebo internetového
prehliadača (Chrome, Edge, Firefox, ...).
Príkaz pre prevod videa do gif je nasledujúci:
ffmpeg -i video.mp4 mikrovideo.gif -hide_banner
Prenesenie úseku videá
Ak by ste chceli do gifu preniesť len časový úsek od / do (napr. 4 sekundy) v nejakom rozlíšenie, potom príkaz bude vyzerať takto (opäť použijeme mapu):
ffmpeg -i video.mp4 -ss 00:00:22.000 -to 00:00:28.000 -filter_complex "[0:v] fps=12,scale=w=860:h=-1,split [a][b];[a] palettegen=stats_mode=single [p];[b][p] paletteuse=new=1" mikrovideo1.gif -hide_banner
Parametre sú:
-ss 00:00:22.000 -to 00:00:28.000- definovaný časový úsek zo zdrojového videa[0:v]- pole vstupov začína nulou, takže sa jedna o definícii video streamu zo súboruvideo.mp4fps=12- frame per second, teda 12 obrázkov za sekunduscale=w=860:h=-1- veľkosť banneru, definuje sa len šírka (width)
Zmena obrázkového kontajnera (súborového formátu)
Posledná možnosť, ktorú by sme mohli využívať, je prevod medzi jednotlivými obrázkovými formátmi. Príkaz je:
ffmpeg -i obrazek.jpg obrazek.gif -hide_banner
alebo
ffmpeg -i obrazek.jpg obrazek.bmp -hide_banner
V budúcej lekcii, Ffmpeg a transcoding - Rotácia, titulky, metadáta , si predvedieme, ako sa pracuje s titulkami a metadátami.
