8. diel - Ffmpeg a transcoding - Rotácia, titulky, metadáta
V minulej lekcii, Ffmpeg a transcoding - Obrázky , sme si ukázali ako získavať obrázky z filmov a aj naopak vkladať obrázky do videa.
Dnes, aby sme boli kompletné, si predvedieme ešte ďalšie možnosti, ktoré nám FFmpeg ponúka. V FFmpeg tutoriálu sa naučíme, ako sa rotuje video a pracuje s titulkami a metadátami.
Rotácie videá
Často dochádza k tomu, že pri tvorbe videa človek zabudne (alebo si to vôbec nepamätá, pretože mu to nepripadá dôležité), ako má držať kameru (telefón). Keď chce potom video prehrať, je na obrazovke otočené. Tento problém FFmpeg tiež dokáže vyriešiť.
Príklad
Takto otočíme video v smere hodinových ručičiek o 90 °:
ffmpeg -i video.mp4 -vf "transpose=1" out.mp4
A takto zas otočíme video proti smeru hodinových ručičiek o 90 °:
ffmpeg -i video.mp4 -vf "transpose=2" out.mp4
A do tretice, takto otočíme video proti smeru hodinových ručičiek o 180 °:
ffmpeg -i video.mp4 -vf "transpose=2,transpose=2" out.mp4
S týmto by sme si mali bohato vystačiť. Viac informácií je prípadne napr. "Tu :.
Titulky
Titulky môžeme mať buď ako oddelený stream (softsubs) alebo ako súčasť bitové mapy videa (hardsubs, tieto titulky potom nejdú napr. Vypnúť a sú pevnou súčasťou videa, od toho i ich názov).
Pre definíciu titulkov slúži parameter -c:s
. Ak by sme chceli
existujúce titulky zachovať, možno to cez parameter
-c:s copy
.
Súbory titulkov
Titulky môžeme definovať v externom súbore a pre ten existujú rôzne
formáty, napr. *.srt
, *.sub
, apod. Špecifikácia
štandardu súborového formátu *.srt
je tu. A podporované
titulky v FFmpeg sú špecifikované tu.
Príklad
My si najskôr vyrobíme nejaký súbor titulkov. Spustíme Notepad a nejaké si napíšeme:
0 00:00:01.000 --> 00:00:05.000 Nepodstatný text uvodniho videa 1 00:00:08.000 --> 00:00:10.000 Fontana 2 00:00:15.000 --> 00:00:20.000 Opet nějaky dalsi text
Súbor uložíme ako Titulky.srt
, v znakovej sade
UTF-8 a nemajte aktívny zalamovanie
riadkov (Word wrap). Ďalej je možné vykonávať prevody medzi
súbormi titulkov.
Prevod súboru titulkov
Súbor titulkov možné potom previesť na iný. Napríklad takto previesť
titulky z typu .srt
na .ass
:
ffmpeg -i Titulky.srt Titulky.ass
Pridanie titulkov do videa
Teraz nahráme titulky priamo do súboru videa, aby nebol potreba ten externý, ktorý treba niekto nevie načítať.
Podpora kontajnera
Je vhodné si najskôr skontrolovať kompatibilitu súborových kontajnerov a titulkových formátov.
V uvedených príkladoch sa nestanú fonty streamu a titulky sa stanú neoddeliteľnou súčasťou obrazu (známe ako hardsubs, natvrdo pridanej titulky). Čo znamená, že už z videa nepôjdu odstrániť.
Pridanie .srt
titulkov priamo do videa
Najjednoduchšie pridanie titulkov .srt
do videa sa vykoná
takto:
ffmpeg -i video.mp4 -vf subtitles=Titulky.srt videoTitulky1.mp4
Pridanie .ass
titulkov priamo do videa
Podobne to môžeme urobiť cez .ass
titulky. Najskôr si
vyrobíme súbor .ass
titulkov. No a potom ho do daného videa cez filtre vložíme:
ffmpeg -i video.mp4 -vf ass=Titulky.ass videoTitulky2.mp4
Nastavenie písma titulkov
Samozrejme možno zmeniť aj nastavenie titulkov, ak nám font či veľkosť nevyhovuje. Tu definujeme veľkosť fontu a červenú farbu:
ffmpeg -i video.mp4 -vf "subtitles=Titulky.srt:force_style='Fontsize=30,PrimaryColour=&H0000ff&'" -c:a copy videoTitulky3.mp4
výsledok:
Skúsme si ďalšie nastavenia. Tu definujeme typ fontov, veľkosť fontu, odsadenie od spodnej hrany obrazovky, bielu farbu fontu a šedú farbu orámovania fontu:
ffmpeg -i video.mp4 -vf "subtitles=Titulky.srt:force_style='FontName=Roboto,FontSize=32,OutlineColour=&H80000000,MarginV=20,PrimaryColour=&H00FFFFFF'" -c:a copy videoTitulky4.mp4
výsledok:
Najvhodnejšie variant je pracovať s titulkami vo formáte
.ass
, ktorý možno upravovať cez softvér Aegisub. Prípadne si možno
prezrieť ďalšie nastavenia cez FFmpeg.
Pridanie titulkov ako softsubs
Titulky môžeme k videu pridať ako stream (známe ako softsubs), čo je tá
ideálna možnosť. Pokiaľ ju formát podporuje, potom sa to rieši príkazom
nižšie. Nefunguje však pri formáte .mp4
, nutné použiť
.mkv
:
ffmpeg -i video.mkv -i Titulky.ass -codec copy -map 0 -map 1 videoTitulky7.mkv
Rovnaká je aj variant pre súbory .srt
:
ffmpeg -i video.mkv -i Titulky.srt -codec copy -map 0 -map 1 videoTitulky8.mkv
Získanie a odstránenie titulkov z videa
Titulky môžeme z videa načítať a prípadne odstrániť.
Načítanie titulkov z videa
Získanie titulkov môžeme vykonať napr. Cez mapu. Podmienkou je, že titulky musí byť streamy. U nestreamových titulkov to nebude fungovať:
ffmpeg -i videoTitulky7.mkv -map 0:s:0 TitulkyZiskane.srt
Parametre príkazu sú:
-map
- Definícia mapy vstupného súboru0:s:0
- Nastavíme stream titulkov (s
ako subtitle) zo vstupného súboru a vložíme ho do výstupného súboru
Odstránenie titulkov z videa
Odstránenie titulkov z multimediálneho súboru vykonáme nasledovne. Ovšem titulky musí byť opäť stream:
ffmpeg -sn -i videoTitulky8.mkv videoNeTitulky.mkv
Metadáta súborového kontajnera
Už v úvodnej lekcii sme si hovorili, že skoro každý súborový kontajner podporuje metadáta. Metadáta sú prakticky iba pomocné informácie súborového kontajnera. Každý typ kontajneru podporuje trochu iná metadáta. V tomto prípade je najlepšie naštudovať si štandard daného súborového kontajnera (súborového formátu) a čo je podporované a ako.
Metadáta kontajnera vs. metadáta streamu
Dá sa povedať, že existujú dva typy metadát. Metadáta pre súborový kontajner a metadáta pre jednotlivé streamy (video, audio, titulky, obrázky atď.). Metadáta súborového kontajnera nie sú metadáta jednotlivých streamov.
Získanie metadát
Najskôr si vypíšeme informácie o nami zvolenom videu, ktoré sme si vyrobili v predchádzajúcich lekciách (presnejšie v lekcii FFmpeg a transcoding - Rozlíšenie, Bitrate):
ffprobe -i video3000K.mkv -hide_banner
výsledok:
Vloženie metadát do videa
Teraz do videa vložíme danej metainformácie. Ak chceme upraviť danú metainformácií, stačí vlastne len existujúce hodnotu prepísať. Pretože sme nešpecifikovali parametre video a audio kodeku, dôjde opäť k defaultnímu prekódovanie:
ffmpeg -i video3000K.mkv -metadata title="Titulek Filmu" -metadata year="2020" -metadata description="video s 3000 bitrate" -metadata language="Čeština" -vcodec copy -acodec copy video3000K_meta.mkv
Vykonáme si kontrolný výpis:
ffprobe -i video3000K_meta.mkv -hide_banner
Tu môžeme pozorovať, ako sa metadáta uložila. Avšak Čeština sa
nezapísala. Je to pravdepodobne spôsobené tým, že formát .mkv
alebo FFmpeg podporuje u metadát len ASCII a nie UTF-8 či iné znakové
sady:
Odstránenie metadát
Ak chceme odstrániť len jeden záznam z metadát, prevedieme to týmto príkazom:
ffmpeg -i video3000K_meta.mkv -metadata language='' -c:v copy -c:a copy video3000K_meta1.mkv
A ak chceme odstrániť všetky metadáta? Príkaz je nasledujúci:
ffmpeg -i video3000K_meta.mkv -map_metadata -1 -c:v copy -c:a copy video3000K_meta2.mkv
Metadáta a externé súbory
Metadáta možno samozrejme vkladať a získavať (dump / export alebo load / import) cez externé súbory podobne, ako tomu bolo u titulkov. Takto sa napr. Exportujú metadáta kontajnera:
ffmpeg -i video3000K_meta.mkv -f ffmetadata in.txt
Import metadát z externého súboru
Ak by sme chceli importovať externý súbor ako metadáta, urobíme to takto:
ffmpeg -i video3000K.mkv -f ffmetadata -i in.txt -vcodec copy -acodec copy -map_metadata 1 video3000K_meta3.mkv
výsledok:
Export metadát do externého súboru
FFmpeg má umožňovať editácie, pridanie a zmazanie aj metadát pri jednotlivých streamov. Osobne nemám túto funkcionalitu otestovanú. Ak chceme vyexportovať metadáta pre jednotlivé streamy, urobíme to takto:
ffmpeg -i video3000K.mkv -map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a -f ffmetadata in2.txt
Záver
Náš kurz FFmpeg je u konca. Dúfam, že ste sa niečo naučili a že vám vedomosti v praxi pomôžu. Samozrejme v našom tutoriálu sme neprešli úplne všetko, čo FFmpeg dokáže. Dá sa ale povedať, že podstatné a najčastejšie funkcie tu obsiahnuté sú. Je možné, že v budúcnosti ešte niečo k tejto téme napíšem (napr. Streamovanie cez sieť, FFmpeg prehrávača ..) alebo prevediem rozšírenie základných lekcií o pár ďalších postupov.