Lekce 8 - FFmpeg a transcoding - Rotace, titulky, metadata
V minulé lekci, FFmpeg a transcoding - Obrázky, jsme si ukázali jak získávat obrázky z filmů a i naopak vkládat obrázky do videa.
Dnes, abychom byli kompletní, si předvedeme ještě další možnosti, které nám FFmpeg nabízí. V FFmpeg tutoriálu se naučíme, jak se rotuje video a pracuje s titulky a metadaty.
Rotace videa
Často dochází k tomu, že při tvorbě videa člověk zapomene (nebo si to vůbec nepamatuje, protože mu to nepřipadá důležité), jak má držet kameru (telefon). Když chce pak video přehrát, je na obrazovce otočené. Tento problém FFmpeg také dokáže vyřešit.
Příklad
Takto otočíme video ve směru hodinových ručiček o 90°:
ffmpeg -i video.mp4 -vf "transpose=1" out.mp4
A takto zas otočíme video proti směru hodinových ručiček o 90°:
ffmpeg -i video.mp4 -vf "transpose=2" out.mp4
A do třetice, takto otočíme video proti směru hodinových ručiček o 180°:
ffmpeg -i video.mp4 -vf "transpose=2,transpose=2" out.mp4
S tímto bychom si měli bohatě vystačit. Více informací je případně např. "zde:.
Titulky
Titulky můžeme mít buď jako oddělený stream (softsubs) nebo jako součást bitové mapy videa (hardsubs, tyto titulky pak nejdou např. vypnout a jsou pevnou součástí videa, od toho i jejich název).
Pro definici titulků slouží parametr -c:s
. Pokud bychom
chtěli stávající titulky zachovat, lze to přes parametr
-c:s copy
.
Soubory titulků
Titulky můžeme definovat v externím souboru a pro ten existují různé
formáty, např. *.srt
, *.sub
, apod. Specifikace standardu
souborového formátu *.srt
je zde. A podporované
titulky v FFmpeg jsou specifikovány zde.
Příklad
My si nejdříve vyrobíme nějaký soubor titulků. Spustíme Notepad a nějaké 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
Soubor uložíme jako Titulky.srt
, ve znakové sadě
UTF-8 a nemějte aktivní zalamování
řádků (Word wrap). Dále je možné provádět převody mezi soubory
titulků.
Převod souboru titulků
Soubor titulků lze poté převést na jiný. Například takto převést
titulky z typu .srt
na .ass
:
ffmpeg -i Titulky.srt Titulky.ass
Přidání titulků do videa
Nyní nahrajeme titulky přímo do souboru videa, aby nebyl potřeba ten externí, který třeba někdo neumí načíst.
Podpora kontejneru
Je vhodné si nejdříve zkontrolovat kompatibilitu souborových kontejnerů a titulkových formátů.
V uvedených příkladech se nestanou fonty streamem a titulky se stanou nedílnou součástí obrazu (známé jako hardsubs, natvrdo přidané titulky). Což znamená, že už z videa nepůjdou odstranit.
Přidání .srt
titulků přímo do videa
Nejjednodušší přidání titulků .srt
do videa se provede
takto:
ffmpeg -i video.mp4 -vf subtitles=Titulky.srt videoTitulky1.mp4
Přidání .ass
titulků přímo do videa
Podobně to můžeme udělat přes .ass
titulky. Nejdříve si
vyrobíme soubor .ass
titulků. No a pak jej do daného videa přes filtry vložíme:
ffmpeg -i video.mp4 -vf ass=Titulky.ass videoTitulky2.mp4
Nastavení písma titulků
Samozřejmě lze změnit i nastavení titulků, pokud nám font či velikost nevyhovuje. Zde definujeme velikost fontu a červenou barvu:
ffmpeg -i video.mp4 -vf "subtitles=Titulky.srt:force_style='Fontsize=30,PrimaryColour=&H0000ff&'" -c:a copy videoTitulky3.mp4
Výsledek:
Zkusme si další nastavení. Zde definujeme typ fontů, velikost fontu, odsazení od spodní hrany obrazovky, bílou barvu fontu a šedou barvu ohraničení 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ýsledek:
Nejvhodnější varianta je pracovat s titulky ve formátu
.ass
, který lze upravovat přes software Aegisub . Případně si lze
prohlédnout další nastavení přes FFmpeg.
Přidání titulků jako softsubs
Titulky můžeme k videu přidat jako stream (známé jako softsubs), což je
ta ideální možnost. Pokud ji formát podporuje, pak se to řeší příkazem
níže. Nefunguje ovšem u formátu .mp4
, nutno použít
.mkv
:
ffmpeg -i video.mkv -i Titulky.ass -codec copy -map 0 -map 1 videoTitulky7.mkv
Stejná je i varianta pro soubory .srt
:
ffmpeg -i video.mkv -i Titulky.srt -codec copy -map 0 -map 1 videoTitulky8.mkv
Získání a odstranění titulků z videa
Titulky můžeme z videa načíst a případně odstranit.
Načtení titulků z videa
Získání titulků můžeme provést např. přes mapu. Podmínkou je, že titulky musí být streamem. U nestreamových titulků to nebude fungovat:
ffmpeg -i videoTitulky7.mkv -map 0:s:0 TitulkyZiskane.srt
Parametry příkazu jsou:
-map
- Definice mapy vstupního souboru0:s:0
- Nastavíme stream titulků (s
jako subtitle) ze vstupního souboru a vložíme jej do výstupního souboru
Odstranění titulků z videa
Odstranění titulků z multimediálního souboru provedeme následovně. Ovšem titulky musí být opět stream:
ffmpeg -sn -i videoTitulky8.mkv videoNeTitulky.mkv
Metadata souborového kontejneru
Už v úvodní lekci jsme si říkali, že skoro každý souborový kontejner podporuje metadata. Metadata jsou prakticky pouze pomocné informace souborového kontejneru. Každý typ kontejneru podporuje trochu jiná metadata. V tomto případě je nejlepší nastudovat si standard daného souborového kontejneru (souborového formátu) a co je podporováno a jak.
Metadata kontejneru vs. metadata streamu
Dá se říci, že existují dva typy metadat. Metadata pro souborový kontejner a metadata pro jednotlivé streamy (video, audio, titulky, obrázky atd.). Metadata souborového kontejneru nejsou metadata jednotlivých streamů.
Získání metadat
Nejdříve si vypíšeme informace o námi zvoleném videu, které jsme si vyrobili v dřívějších lekcích (přesněji v lekci FFmpeg a transcoding - Rozlišení, Bitrate):
ffprobe -i video3000K.mkv -hide_banner
Výsledek:
Vložení metadat do videa
Nyní do videa vložíme dané metainformace. Pokud chceme upravit danou metainformaci, stačí vlastně pouze stávající hodnotu přepsat. Protože jsme nespecifikovali parametry video a audio kodeku, dojde opět k defaultnímu překódování:
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
Provedeme si kontrolní výpis:
ffprobe -i video3000K_meta.mkv -hide_banner
Zde můžeme pozorovat, jak se metadata uložila. Nicméně čeština se
nezapsala. Je to pravděpodobně způsobeno tím, že formát .mkv
nebo FFmpeg podporuje u metadat jen ASCII a nikoliv UTF-8 či jiné znakové
sady:
Odstranění metadat
Pokud chceme odstranit jen jeden záznam z metadat, provedeme to tímto příkazem:
ffmpeg -i video3000K_meta.mkv -metadata language='' -c:v copy -c:a copy video3000K_meta1.mkv
A pokud chceme odstranit všechna metadata? Příkaz je následující:
ffmpeg -i video3000K_meta.mkv -map_metadata -1 -c:v copy -c:a copy video3000K_meta2.mkv
Metadata a externí soubory
Metadata lze samozřejmě vkládat a získávat (dump/export nebo load/import) přes externí soubory podobně, jako tomu bylo u titulků. Takto se např. exportují metadata kontejneru:
ffmpeg -i video3000K_meta.mkv -f ffmetadata in.txt
Import metadat z externího souboru
Pokud bychom chtěli importovat externí soubor jako metadata, uděláme to takto:
ffmpeg -i video3000K.mkv -f ffmetadata -i in.txt -vcodec copy -acodec copy -map_metadata 1 video3000K_meta3.mkv
Výsledek:
Export metadat do externího souboru
FFmpeg má umožňovat editace, přidání a smazání i metadat u jednotlivých streamů. Osobně nemám tuto funkcionalitu otestovanou. Pokud chceme vyexportovat metadata pro jednotlivé streamy, udělá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ávěr
Náš kurz FFmpeg je u konce. Doufám, že jste se něco naučili a že vám znalosti v praxi pomohou. Samozřejmě v našem tutoriálu jsme neprošli úplně vše, co FFmpeg dokáže. Dá se ale říci, že podstatné a nejčastější funkce zde obsaženy jsou. Je možné, že v budoucnu ještě něco k tomuto tématu napíši (např. streamování přes síť, FFmpeg přehrávače .. ) nebo provedu rozšíření základních lekcí o pár dalších postupů.