Multimediální frameworky: nízkoúrovňová sada nástrojů FFmpeg

15. 1. 2025
Doba čtení: 7 minut

Sdílet

Autor: Depositphotos
Multimediální frameworky představují klíčové nástroje pro zpracování a manipulaci s audiovizuálními daty. V tomto článku se nejprve seznámíme s jejich funkcemi a významem, poté se zaměříme na praktické využití FFmpeg.

Co je multimediální framework?

Před vlastním přehledem je nejprve nutné vysvětlit, co to vlastně multimediální framework je. Jedná se o soubor knihoven a nástrojů pro práci s multimediálními daty, nejčastěji videem a audiem. Na tento framework můžeme nahlížet z pohledu aplikace, která v sobě chce jeho služby využít. Aplikací může být třeba audio nebo video přehrávač, editor videa, streamovací server apod.

Například přehrávač může po frameworku žádat otevření souboru s videem a postupnou dekompresi některých snímků. Editor videa bude chtít snímky také zkomprimovat a uložit do kontejneru. Klient pro konference VoIP bude požadovat otevření zvukové karty a kompresi zachytávaného zvuku. Příkladů může být spousta.

Framework v sobě zaobaluje určitou minimální funkcionalitu, kterou je možno dále rozšiřovat – většinou instalací zásuvných modulů. V tomto případě se na framework nahlíží z pohledu tohoto modulu, což může být např. nový kodek, postprocessingový filtr, modul pro přístup ke zvukovému subsystému, modul umožňující využít hardwarovou akceleraci při dekódování videa apod. Zásuvné moduly rozšiřující funkcionalitu frameworku budou zřejmě využívat odlišné části API frameworku. Celou situaci shrnuje blokový diagram na obrázku níže.

Na obrázku vidíme vztah multimediálního frameworku, klientských aplikací a rozšiřujících modulů. Framework sám o sobě poskytuje jen omezenou funkcionalitu. Tu lze ovšem rozšiřovat instalací nových částí (např. kodek nebo filtr s video efekty). Mezi aplikace využívající framework se řadí také ty nástroje, které jsou šířeny spolu s frameworkem (např. konzolové nástroje umožňující stavbu grafu filtrů).

Rozšíření funkcionality frameworku často vyžaduje administrátorská oprávnění – není-li framework nainstalován jen v adresáři určitého uživatele. Některé frameworky (např. GStreamer) umožňují uživateli načíst rozšiřující moduly i bez instalace do systému. U některých to není z principu možné, protože přidání nové funkcionality vyžaduje znovupřeložení frameworku. To je případ frameworku FFmpeg.

Uvnitř frameworku

Frameworky mohou mít uvnitř fixní graf toku dat (pipeline). To je případ jednoho z nejstarších frameworků – Video for Windows. To samozřejmě použití frameworku velmi omezuje (aplikace jej může použít jen k přesně definovaným úkonům). Většinou však lze tok dat (graf filtrů) uvnitř frameworku ovlivnit. Třeba GStreamer umožňuje klientské aplikaci postavit si graf téměř libovolně a poskládat tak jakoukoli aplikaci (přehrávač audia, rekomprese videozáznamu nebo zachytávaní síťového vysílání). Jednoduchý graf filtrů je zobrazen na obrázku níže.

Na obrázku vidíme graf filtrů pro přehrávač videa. Zeleně je označen zdrojový filtr (soubor z disku), modře transformační filtry (demuxer, dekodéry, konvertory formátů) a červeně výstupní filtry (obrazovka, zvuková karta).

Filtry zde zobrazené lze rozdělit do tří skupin – zdroje datového toku, transformace a cílové filtry. Takové rozdělení lze víceméně nalézt u všech frameworků. Jednotlivé filtry jsou propojeny přes vstupy/výstupy, které se v závislosti na frameworku nazývají např. pady nebo piny. Filtr může mít dle svého určení žádný, jeden nebo více vstupů a výstupů.

Aby bylo možné dva filtry propojit, musejí se shodnout na typu datového toku. Nelze např. napojit dekodér videa na vstup zvukové karty. Některé framewoky umějí formát dat v omezené míře konvertovat. Lze tak automaticky provádět změnu vzorkovací frekvence u audia nebo formátu pixelu u videa. Jiné frameworky však tohle neumožňují. V takovém případě je nutné, aby se navazující filtry na typu dat shodly (jinak se nespojí).

Ještě je třeba vyjasnit si některé pojmy. Kódování a dekódování dat provádí kodér a dekodér. Kodek (z anglického codec, coder–decoder) je jejich kombinace, tedy software nebo hardware schopný zakódovat a dekódovat datový proud. Kompresi a dekompresi provádí kompresor resp. dekompresor. Je třeba nezaměňovat pojem kodek s pojmem formát. Formát je specifikace komprimovaných dat, tedy standard, a kodeky jsou konkrétními implementacemi tohoto standardu. Například kodek DivX pracuje s formátem MPEG-4. Některé filtry mohou tok dat větvit nebo spojovat (demuxery/splittery, muxery, overlaye).

FFmpeg

FFmpeg je jeden z nejvýznamnějších frameworků unixového světa. Jedná se vlastně o několik knihoven, z nichž nejdůležitější jsou libavcodec (audio a video kodeky) a libavformat (kontejnery). Využívají jej např. MPlayer, VLC media player, xine, Avidemux, ffdshow a další.

Jedná se o nízkoúrovňový framework s rozhraním pro jazyk C. Součástí balíku FFmpeg jsou (mimo vlastních knihoven) i konzolové nástroje pro snadné použití z příkazové řádky. Knihovny i nástroje jsou krátce popsány níže.

FFmpeg s sebou přináší tyto tři nástroje pro příkazovou řádku:

  • ffmpeg  – Slouží pro překódování multimediálních souborů.
  • ffplay  – Jednoduchý přehrávač založený na SDL.
  • ffprobe  – Nástroj, který zobrazí informace o multimediálních souborech.

Dále můžeme říci, že sestává z těchto knihoven:

  • libavutil  – Obsahuje pomocné funkce (generátor náhodných čísel, logování zpráv, ošetření chyb), funkce pro konverzi barevných prostorů, datové struktury, matematické konstatny a funkce (zaokrouhlování, logaritmus, převody číselných typů, racionální čísla), definice formátů pixelu, typů snímků, typů datových proudů atd.
  • libavcodec  – Obsahuje kodéry a dekodéry pro audio a video formáty.
  • libavformat  – Obsahuje muxery a demuxery pro různé kontejnerové formáty.
  • libavdevice  – Poskytuje napojení na různé multimediální frameworky (Video4Linux2, Video for Windows, DirectShow, ALSA, OSS, PulseAudio).
  • libavfilter  – Filtry (split, crop, ass, hflip, frei0r, unsharp), grafy filtrů.
  • libswscale  – Rychlá změna rozlišení a převod barevných modelů.
  • libswresample  – Rychlá změna vzorkovací frekvence a formátu audia.

Základy

Následující příkaz zobrazí podporované kontejnerové formáty. Příznak „D“ značí demuxer (splitter) a „E“ značí muxer.

ffmpeg -formats

Analogicky lze pomocí volby -codecs zobrazit dostupné kodeky („D“ zde značí dekodér, „E“ kodér), -filters filtry, -pix_fmts formáty pixelu nebo -protocols protokoly (např. RTMP).

Nástrojffplay slouží k rychlému přehrání videa. Následující příkaz zobrazí pomocí knihovny SDL okno a přehraje v něm žádané video.

ffplay clock.avi

Přidáním volby-vf vflip se na video aplikuje filtr, který každý snímek vertikálně překlopí. Filtrům lze předávat parametry, např.-vf crop=256:256:0:0 použije filtr pro ořezání videa, kde výstupní (ořezané) video bude mít rozměry 256×256 pixelů a ořez bude počínat na souřadnicích (0, 0) původního (vstupního) videa. Z filtrů je také možné sestavit graf. Prosté zřetězení (spojení) filtrů se provede pomocí čárky:-vf "transpose, negate" video nejprve transponuje, poté neguje barvy. Takto zřetězeným filtrům se říká řetězec filtrů.

Z jednotlivých řetězců (větví grafu) lze sestavit graf filtrů. Jednotlivé řetězce se od sebe oddělují pomocí středníku. Některé filtry mají několik vstupů a výstupů, ty se anglicky označují jako pad (podložka). Pokud je třeba sestavit větvený graf filtrů, je třeba tyto pady pojmenovat. Názvy padů se uzavírají do hranatých závorek a zapisují se před (vstupní) a za (výstupní) název filtru.

Není třeba pojmenovat všechny pady. Nepojmenované jsou propojovány automaticky podle následujícího pravidla. První nepojmenovaný výstupní pad je připojen na první nepojmenovaný vstupní pad následujícího filtru řetězce. Například filtr split (větvení videa) má jeden vstup a dva výstupy, filtr overlay (překryv/spojení videa) má naopak dva vstupy a jeden výstup. Řetězec nullsrc, split [L1], [L2] overlay, nullsink tedy nejprve rozvětví vstup na dva výstupy (první s názvem „L1“ a druhý nepojmenovaný), pak překryje video ze dvou vstupů (první s názvem „L2“, druhý nepojmenovaný). Po automatickém propojení bude druhý nepojmenovaný výstup filtru split napojen na druhý nepojmenovaný vstup filtru overlay. Graf filtrů je platný (validní) pouze v případě, že jsou všechny pady (vstupy a výstupy) někam napojeny.

Následující příkaz otevře video, rozvětví ho, v první větvi provede ořez horní poloviny (zůstane spodní), ve druhé větvi provede negaci a překryv s ořezanou spodní polovinou.

ffplay -vf "[in] split [T1], negate, [T2] overlay=0:H/2 [out]; [T1] crop=iw:ih/2:0:ih/2 [T2]" clock.avi

Lépe vše osvětluje graf na obrázku níže získaný pomocí nástroje  graph2dot.

Na obrázku je vyobrazen graf filtrů FFmpegu, který provede rozvětvení, úpravu a opětovné sloučení videa.

Obrázek zobrazuje výstup grafu. Snímek je v jedné větvi negován. Jeho spodní polovina je pak překryta druhou ořezanou větví.

Další použití

Přepínačem -f lze udat vstupní zařízení (např. alsa, oss, video4linux). Zobrazení vstupu z webkamery se provede následovně.

ffplay -f video4linux2 /dev/video0

K zobrazení informací o videu (datové toky, formáty audia/videa) slouží příkaz ffprobe . Jako parametr postačí název souboru.

ffprobe clock.avi

Uvedený příkaz zobrazí výstup podobný následujícímu.

Input #0, avi, from 'clock.avi':
  Duration: 00:00:12.00, start: 0.000000, bitrate: 55 kb/s
    Stream #0:0: Video: msrle ([1][0][0][0] / 0x0001), pal8, 321x321, 1 fps, 1 tbr, 1 tbn, 1 tbc
    Stream #0:1: Audio: truespeech ("[0][0][0] / 0x0022), 8000 Hz, 1 channels, s16, 8 kb/s

K překódování videa slouží příkaz ffmpeg . Syntaxe volání je následující.

ffmpeg [globalni volby] [[volby pro vstup] [-i vstup]]... {[volby pro vystup] vystup}...

Například triviální použití pro konverzi do kontejnerového formátu Matroska s videokodekem FFV1 a audiokodekem FLAC bude vypadat takto.

ffmpeg -i clock.avi -c:v ffv1 -c:a flac output.mkv

Pro výstupní video je možné nastavit různé parametry. Zde bude mít výstup datový tok videa 64 kbit/s.

ffmpeg -i input.avi -b:v 64k output.avi

Záznam videa z webkamery a zvuku ze zařízení OSS lze provést následovně.

ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 output.mpg

(Autorem obrázků je David Bařina.)

Neutrální ikona do widgetu na odběr článků ze seriálů

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.


Autor článku

Autor vystudoval Fakultu informačních technologií VUT v Brně, kde nyní pracuje jako vědecký pracovník. Zajímá se o multimédia a na svých strojích používá výhradně Gentoo Linux.