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 umiestni25
pixelov zľava a25
pixelov zhora v obrazu videa. [0: 0] je vľavo hore.enable='between(t,0,20)'
- obrázok bude vo videu v čase od00:00:00
do00: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.mkv
bude byť normálny priebeh, 1sec = 1 sec, <1 zrýchľuje video,> 1 spomaľuje videooverlay=25:25:
- ľavý horný roh videa sa umiestni25
pixelov zľava a25
pixelov 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:00
do00: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.mp4
fps=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.