IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

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 obrázkov z video súboru

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 chceme
  • obrazek.jpg - názov súboru a typ kontajnera (obrázkový formát)

výsledok:

Získanie obrázka z filmu v ffmpeg - Úprava audio a video súborov pomocou frameworku FFmpeg

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 umiestni 25 pixelov zľava a 25 pixelov zhora v obrazu videa. [0: 0] je vľavo hore.
  • enable='between(t,0,20)' - obrázok bude vo videu v čase od 00:00:00 do 00:00:20.
Ako vidíte v obrázku nižšie, tak obrázok vo videu skutočne je. Nie je problém tak do videa vložiť prakticky svoje logo, aby nám ho niekto neukradol:
Vloženie loga do videa - Úprava audio a video súborov pomocou frameworku FFmpeg

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úboru video.mp4
  • [1:v]setpts=1*PTS[a] - video stream z video320_240.mkv bude byť normálny priebeh, 1sec = 1 sec, <1 zrýchľuje video,> 1 spomaľuje video
  • overlay=25:25: - ľavý horný roh videa sa umiestni 25 pixelov zľava a 25 pixelov zhora v obrazu videa. [0: 0] je vľavo hore.
  • enable='between(t,0,20)' - vložené mikrovideo bude vo videu v čase od 00:00:00 do 00:00:20.
Ako vidíte v priloženom obrázku, video je skutočne vložené vo videu:
Vloženie videa do videa - Úprava audio a video súborov pomocou frameworku FFmpeg

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úboru video.mp4
  • fps=12 - frame per second, teda 12 obrázkov za sekundu
  • scale=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.


 

Predchádzajúci článok
Ffmpeg a Transcoding - Audio
Všetky články v sekcii
Úprava audio a video súborov pomocou frameworku FFmpeg
Preskočiť článok
(neodporúčame)
Ffmpeg a transcoding - Rotácia, titulky, metadáta
Článok pre vás napísal Robert Michalovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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