31.
Zpracování videa a zvuku
1. Úvod
FFmpeg je nástroj pro konverzi, úpravu a streamování videa, zvuku a titulků. Hlavní výhodou FFmpegu oproti videoeditorům s grafickým uživatelským rozhraním je modularita a opakovatelnost zpracování pro různé vstupní soubory.
Tato verze kapitoly nepokrývá všechny dostupné filtry ffmpegu (zvlášť v oblasti zpracování zvuku není pokrytí příliš dobré) a neobsahuje vysvětlení pojmu PTS. Rovněž chybí popis vestavěných funkcí používaných ve výrazech v parametrech filtrů.
2. Definice
- Stopa (stream) je časovaná složka multimediálního souboru proložená v čase s ostatními stopami téhož souboru. Stopy v jednom souboru mohou být různého typu (obrazová, zvuková, titulková či datová) a mohou mít různou délku.
- Kanál (plane/channel) je datová vrstva tvořící stopu s ostatními kanály. Všechny kanály stopy trvají vždy stejně dlouho a tvoří každý snímek obrazu či vzorek zvuku společně. Obrazová stopa se typicky dělí na kanály Y (svítivost), U a V (barva), případně ještě alfa (krytí); zvuková stopa mívá nejčastěji kanály FR a FL (stereo), méně často jeden kanál (mono) či více kanálů.
- Snímek je základní kvantum obrazové stopy. Vzorkovací frekvence videa čili počet snímků za sekundu se nazývá fps. Hodnota fps se obvykle pohybuje v rozmezí 10 až 60.
- Vzorek je základní kvantum zvukové stopy. Obvyklá vzorkovací frekvence zvuku je 44 100 vzorků za sekundu.
- Filtr je objekt v grafu filtrů, který očekává určitý počet vstupů určitého typu v určitém pořadí (toto očekávání se může lišit v závislosti na parametrech). Na tyto vstupy je pak potřeba připojit buď stopy vstupů ffmpegu (typicky vstupních souborů) nebo výstupy jiných filtrů. Filtr mívá také výstupy, které je pak nutno připojit na vstupy jiných filtrů nebo na stopy výstupů ffmpegu. Filtr, která má výstupy, ale ne vstupy, se nazývá generátor, přestože může načítat data z disku.
- Graf filtrů je orientovaný graf definovaný uživatelem, který popisuje tok dat různého typu přes ffmpeg ze vstupů na výstupy. V grafu filtrů nejsou dovoleny nepřipojené vstupy či výstupy filtrů.
2/1 Syntaxe grafu filtrů
Základním nástrojem pro zpracování multimediálních souborů v ffmpegu je tzv. graf filtrů (filtergraph), který může být buď kompletní, definovaný pomocí globálního parametru -filter_complex (resp. -filter_complex_script), nebo jednoduchý, definovaný pomocí výstupních parametrů -vf a -af.
V komplexním grafu filtrů se každá stopa vstupu značí formou „[0:v]“, kde na místě 0 je pořadové číslo vstupu (počítáno od nuly) a na místě „v“ může být „v“ pro výchozí obrazovou stopu, „a“ pro výchozí zvukovou stopu, nebo pořadové číslo stopy v kontejneru vstupního souboru (lze zjistit z výstupu příkazu „ffprobe“).
Jednoduché propojení mezi filtry se v komplexním i jednoduchém grafu filtrů vytvoří tak, že se filtry zapíšou vedle sebe a oddělí čárkou (kde propojení není, píše se místo čárky středník). V komplexním grafu filtrů se vytvářejí také pojmenovaná propojení, jejichž identifikátory je nutno uzavřít do hranatých závorek. Zatímco u jednoduchého grafu filtrů se konec namapuje na stopu výstupního souboru automaticky, u komplexního grafu filtrů to musíme udělat ručně, samostatným výstupním parametrem „-map“.
3. Zaklínadla: Filtry
V této sekci používám následující konvence: vi značí obrazový vstup filtru (opakuje se tolikrát, kolik má filtr obrazových vstupů); analogicky ai zvukový vstup, vo obrazový výstup a ao zvukový výstup. Značky io1, io2 atd. značí pomocná propojení filtrů, kterým musíte vymyslet nové, v grafu filtrů dosud nepoužité identifikátory.
3/1 Úprava časové osy
3/2 Škálování obrazu (resize)
3/3 Transformace a oříznutí obrazu
3/4 Překryv, skládání a prolínání obrazových stop (blend)
3/5 Jas, kontrast, barva a spol.
3/6 Zapékání titulků
3/7 Roztmívačky, zatmívačky a další přechody (obr. i zvuku)
3/8 Retušování (obrazu)
3/9 Vykreslování do videa
3/10 Ostatní
3/11 Nízkoúrovňové manipulace
3/12 Manipulace obrazu po snímcích
3/13 Základní úprava zvuku
3/14 Pokročilá úprava zvuku
3/15 Vložit ticho
3/16 Konverze mono/stereo/L/R
3/17 Generátory a čtení „bokem“
3/18 Rozdělování a spojování
3/19 Ostatní filtry
4. Zaklínadla: Příkaz ffmpeg
Příkaz ffmpeg přijímá tři typy parametrů: globální, vstupní a výstupní. Globální parametry platí pro danou instanci ffmpegu jako celek. Vstupní parametry se zadávají v sekvenci ukončené parametrem -i a vstupním souborem a platí pouze pro daný vstup. Výstupní parametry se zadávají v sekvenci ukončené výstupním souborem a platí pouze pro daný výstup.
4/1 Globální parametry
4/2 Výstupní parametry
4/3 Vstupní parametry
4/4 Celé příkazy
5. Zaklínadla: Ostatní příkazy
6. Parametry příkazů
Parametry příkazů a způsob volání ffmpegu jsou uvedeny v sekci „Zaklínadla: Příkaz ffmpeg“.
7. Instalace na Ubuntu
Poznámka: ačkoliv jsou kodeky v balíčku chromium-codecs-ffmpeg-extra svobodné, mohou být omezeny patentovou ochranou podporovaných formátů. Pokud vám to vadí, použijte místo „chromium-codecs-ffmpeg-extra“ jen „chromium-codecs-ffmpeg“.
8. Ukázka
Ukázka vyžaduje, abyste v aktuálním adresáři měl/a video „video.mp4“ a to mělo alespoň 30 sekund, obraz (šířku i výšku alespoň 300 pixelů) a zvuk. První uvedený příkaz vypíše parametry videa. Druhý video zmenší na polovinu, vynechá zvuk a vlevo od obrazu umístí jeho černobílou kopii. Třetí příkaz obraz otočí o 180° a vymění dvě obdelníkové oblasti videa; současně do zvuku přidá roztmívačku a dvojnásobnou ozvěnu.
9. Tipy a zkušenosti
- Pokud obraz či zvuk neupravujete a nekonvertujete, můžete jejich původní kvalitu a kodek zachovat zákazem překódování pomocí parametru -c:v copy pro obraz, resp. -c:a copy pro zvuk. Zvuk můžete v takovém případě ořezávat pomocí výstupních parametrů -ss, -to a -t, u obrazu to silně nedoporučuji, protože pak typicky trpí výpadky na začátku a konci výsledného videa.
- Většina kodeků odmítne zapsat video, jehož šířka či výška v pixelech je lichá; myslete na to při používání filtru -scale.
- Výstupy filtrů split a asplit musejí být odebírány paralelně, jinak hrozí přetečení bufferu. Řadě problémů se lze vyhnout tím, že místo rozdělení vstupu na dva načtete tentýž vstupní soubor vícekrát (více parametry -i). Rychlým (ale škaredým a nebezpečným) řešením problémů někdy může být zneužití filtrů „reverse“ a „areverse“, které dokážou v paměti zřídit buffer neomezené velikosti (resp. velikosti omezené jen množstvím dostupné paměti).
- Můžete-li téhož efektu dosáhnout pomocí filtru nebo pomocí výstupního parametru, preferujte parametr; dává jistější výsledky, možná i kvalitnější.
- Pokud použijete kodek „mjpeg“ a vypisuje vám varování „deprecated pixel format used, make sure you did set range correctly“, toto můžete bezpečně ignorovat.
- Při zapékání titulků se ujistěte, že soubor s titulky je v kódování UTF-8 (což často nebývá). Titulky, které nepůjde tímto kódováním znaků dekódovat, filtr „subtitles“ bez varování vynechá!
- Ačkoliv parametr „-filter_complex“ jako globální parametr správně patří na začátek příkazu, jeho uvedení tam je nepraktické a dle mých zkušeností ho ffmpeg správně přijme, i když ho uvedete až před parametry „-map“.
- Kromě datových stop mohou být součástí multimediálního souboru i metadata, která se automaticky zkopírují do výstupního souboru a nepodařilo se mi přijít na způsob, jak se jich snadno zbavit.
10. Další zdroje informací
Dalším velmi dobrým zdrojem je oficiální dokumentace k filtrům, ke které se dostanete tak, že si nainstalujete balíček „ffmpeg-doc“ a v prohlížeči otevřete soubor „/usr/share/doc/ffmpeg/manual/ffmpeg-filters.html“.
- Ffmprovisr (anglicky)
- FFmpeg Wiki (anglicky)
- Dokumentace k filtrům (anglicky)
- Manuálová stránka ffmpeg (anglicky)
- Manuálová stránka ffmpeg-filters (anglicky)
- Playlist videí: FFMPEG & Command Line (anglicky)
- Oficiální stránky (anglicky)
11. Zákulisí kapitoly
V této verzi kapitoly chybí:
- filtry chorus, equalizer, highpass, lowpass, pan, silenceremove, stereowiden, volume (dynamicky)
- popis vestavěných aritmetických funkcí
- vysvětlení PTS
- Otestovat, zda „-pix_fmt yuv420p“ umožní bezproblémové přehrátí videa s kodekem h264 (nebo mpeg4) na Windows 7 a Windows 10.
- Dodělat ukázku.
Tato kapitola záměrně nepokrývá:
- nic