FFMpeg je všestranný nástroj na úpravu videa, zvuku, obrázků i titulků. Lze jej stáhnout na oficiálním webu ffmpeg.org. Pokud chceme verzi pro Microsoft Windows, tak stačí kliknout sem. Zde si pro začátek vybereme release build (4.2.1 v době vzniku článku), Windows 64-bit a Static. Instalace není nutná. Stačí někam rozbalit celý archiv (běžně do C:\ffmpeg\) a případně přidat cestu k ffmpeg.exe do PATH, což bude mít za následek, že bude dostupný bez zadávání cesty, například místo C:\ffmpeg\bin\ffmpeg.exe budeme volat pouze ffmpeg.
Návod jak přidat složku do PATH můžeme najít zde, ale zkráceně – otevřeme si Průzkumník Windows, klikneme pravou myší na Tento počítač a následně na vlastnosti. Následně v novém okně vybereme záložku Upřesnit nastavení systému a dále úplně dole klikneme na Proměnné prostředí. To nám otevře nové okno, kde v horní části budeme mít promměné a hodnoty. Vybereme proměnnou PATH, poté dáme Upravit, stiskneme nový a přidáme adresář C:\ffmpeg\bin ve Windows 10, nebo na konec řetězce připíšeme ;C:\ffmpeg\bin\ ve Windows 7.
Jak přidat složku do PATH můžeme najít zde, ale zkráceně – otevřeme si průzkumník Windows, klikneme pravou myší na Tento počítač a následně na vlastnosti. Následně v novém okně vybereme záložku Upřesnit a dále úplně dole klikneme na Proměnné prostředí. To nám otevře nové okno, kde v horní části budeme mít Promměné a hodnoty. Vybereme proměnnou Path, poté dáme Upravit, stiskneme nový a přidáme adresář C:\ffmpeg\bin.
Na webu FFMpeg je obsáhlá dokumentace a mnoho příkladů se dá dohledat na Internetu, ale v tomto článku se zaměříme na jednoduché příklady a automatizaci.
Jako první krok je potřeba si otevřít okno CMD s příkazovým řádkem v nějaké vhodné složce. Jeden z vhodných způsobů je například si otevřít Stažené soubory v Průzkumníku Windows a poté do pole s adresou složky napsat CMD a potvrdit enterem. Pokud místo CMD chceme Windows Powershell stačí ve složce tak při držení Shift na klávesnici klikněme pravým tlačítkem myši a vyberte Windows Powershell. I v tomto okně poté otestujeme FFMpeg tak, že napíšeme ffmpeg a potvrdíme enterem. Pokud je vše v pořádku měla by se nám zobrazit podobný výpis jako na následujícím obrázku.
Příklady:
Na začátek načteme vstupniSoubor.avi, kdy FFMpeg přečte hlavičku a následně vypíše informace o souboru:
ffmpeg -i vstupniSoubor.avi
- -i značí vstupní soubor. TIP: Při zapisovaní názvu souboru v okně CMD se lze pomocí tabulátoru přepínat mezi soubory v aktuální složce po zapsání několika prvních písmen (a dokonce i okamžitě po napsání mezery za -i, kdy bude procházet všechny soubory).
- Program ale skončí chybou, protože není specifikovaný výstup a případně nějaké nastavení.
Nejzákladnější zápis remuxu, tedy změna kontejneru bez překódování. V našem případě chceme třeba změnu z avi do mkv:
ffmpeg -i vstupniSoubor.avi -c copy vystupniSoubor.mkv
- -c nastavuje kodek, tady ho jen kopírujeme přes copy.
- poslední je vždy název výstupního souboru.
Problém tohoto zápisu je ten, že soubor musí být bez mezery a taky vezme jen jedno video, jedno audio a případně jedny titulky. Jde to upravit následujícím způsobem:
ffmpeg -i "vstupni soubor.avi" -map 0 -c copy "vystupni soubor.mkv"
- -map vybere všechny stopy v souboru.
- uvozovky umožní zadávat i kompletní cesty i s mezerami.
Nastavit kopírování jde i jednotlivě nebo i zakázat. Např zkopírovat jen video:
ffmpeg -i "C:\moje slozka\vstupni soubor.avi" -map 0 -c:v copy -an "vystupni soubor.mkv"
- -c:v vybírá všechny video stopy, podobně je -c:a pro audio, -c:s pro titulky.
- -an zakáže všechny audio stopy, podobně jak -vn pro video a -sn pro titulky.
ffmpeg -i "C:\moje slozka\vstupni soubor.mkv" -map 0 -c:s:0 copy -vn -an "vystupni soubor titulky.ass"
- -c:s:0 vybere jen první titulkovou stopu.
Přípona výstupního souboru je napevno ass a tedy očekávám, že stopa bude tohoto formátu.
ffmpeg -i "C:\moje slozka\vstupni soubor.mkv" -i "vstupni soubor.avi" -map 0:1 -map 0:s? -map 1:v -c copy "vystupni soubor.mkv"
V tomto příkladu jsou dva vstupní soubory, z mkv souboru si beru druhou stopu a všechny titulky pokud tam nějaké jsou (otazník) a pak video z avi souboru.
ffmpeg -i "film.avi" -map 0 -c copy -aspect "16:9" "film fixed.avi"
- -aspect nastaví poměr stran.
Tento příklad je ukázkou opravení poměru stran.
ffmpeg -i "nahravka.ts" -ss 00:10:30 -to 00:32:00 -map 0 -c copy "nahravka strih.mkv"
- -ss nastavuje počáteční čas na vstupním souboru (hh:mm:ss).
- -to nastavuje koncový čas na vstupním souboru (hh:mm:ss).
Tento příklad je ukázkou stříhání nahrávky a remuxu do mkv. Výsledný soubor bude dlouhý 21,5 minut.
Za zmínku dále stojí např.:
- -t nastavuje dobu trvání.
- -frames nastavuje počet framů na výstupu.
- -h zobrazí nápovědu.
- -y potvrzuje přepsání souboru pokud už existuje.
- -n ukončí úlohu pokud by mělo dojít k přepsání souboru.
- -formats zobrazí všechny podporované soubory, samostatně přes -demuxers nebo -muxers.
Automatizace:
CMD umožňuje vykonávat dávkové soubory – tedy předchystané příkazy pomocí bat souborů. Vytvoření toho souboru je velice snadné. Stačí otevřít poznámkový blok nebo jiný textový editor a soubor uložit s příponou bat. Například uloz-do-mkv.bat. Pro vyzkoušení, že vše funguje stačí napsat některý z předchozích příkladů do souboru, uložit ho a dvojklikem ho spustit.
@echo off ffmpeg -i "muj film.avi" -c copy "muj film.mkv" pause
- @echo off – vypíná vypisování jednotlivých řádků bat souboru do okna, k povolení stačí napsat @echo on nebo neuvedením řádku.
- pause – pozastaví běh bat souboru a vyčká na zmáčknutí klávesy, protože je to poslední řádek, běh bat souboru skončí (a v našem případě se CMD okno zavře).
Výsledný soubor by se měl vytvořit stejně jak při ručním zadáním celého ffmpeg zápisu do okna CMD. Bat soubor jde spustit i z již otevřeného okno napsáním jeho názvu (i bez přípony a případně opět prohledáním přes tabulátor – v našem případě pak stačí napsat uloz a zmáčknout tabulátor).
Teď by to chtělo ten dávkový soubor upravit aby fungoval pro každý soubor, to jde udělat následovně:
ffmpeg -i %1 -map 0 -c copy %2
- %1 – označuje první argument.
- %2 – označuje druhý argument.
Takto u pravený soubor je třeba pustit v CMD pomocí uloz-do-mkv.bat "muj film.avi" "muj film.mkv".
CMD se před spuštěním tohoto řádku podívá na argumenty a vloží “muj film.avi” na místo %1 a “muj film.mkv” na %2. Jenže když jen měním příponu souboru nemusím název zadávat dvakrát a jde provést následující úprava:
ffmpeg -i "%~1" -map 0 -c copy "%~n1.mkv"
- %~1 – stejně jak %1 označuje první argument, ale odebere uvozovky pokud jsou kolem názvu souboru, proto je kolem něj můžeme napsat v bat souboru
- %~n1 – vypreparuje z argumentu název bez přípony (a cesty). Více na ss64.com.
Opět lze pustit v CMD pomocí uloz-do-mkv.bat "muj film.avi", ale tentokrát bude fungovat i přetažení – Drag&Drop, tedy že kliknem a podržíme levou myš na avi souboru a přesuneme ho nad bat soubor a pustíme.
To bude ale fungovat jen pro jeden soubor, pro více souborů naráz je to trochu složitější.
@echo off :again ffmpeg -y -i "%~1" -map 0 -c copy "%~p1%~n1.mkv" SHIFT IF "%~1" == "" GOTO:eof GOTO:again :pause pause
- -y – zajistí, aby se ffmpeg nezastavil s otázkou o přepsání a zrovna ji potvrdí. V opačném případě stačí použit -n.
- %~p1 – cesta k souboru. Pokud je bat soubor na jiném disku, dělá to někdy problémy bez něj.
- SHIFT – posune pořadí argumentů. Více na ss64.com.
- IF … – kontroluje jestli je ještě nějaký soubor v řadě.
- GOTO:again – skočí na řádek s :again.
- GOTO:eof – skočí na konec souboru. Pro zastavení pomocí pause je potřeba přepsat GOTO:eof na GOTO:pause.
Opět lze pustit v CMD pomocí uloz-do-mkv.bat "muj film 1.avi" "muj film 2.mp4" [...] a taky pomocí přetažení více souborů (Drag&Drop).
Pokud je potřeba projít všechny soubory ve složce je nejlepším způsobem použít for .. in:
for %%I in ("*.avi") do ffmpeg -y -i "%%~I" -map 0 -c copy "%%~nI.mkv"
Tento přistup vyžaduje uložit bat soubor do stejné složky se soubory a spustit dvojklikem. Přiklad prochází všechny avi soubory, ale jde nastavit kterákoliv přípona i soubor, např.: VID_*.MOV.
Alternativně kdyby bylo potřeba například stříhat, lze si přichystat bat soubor následujícím způsobem a případně přidat @echo off a pause:
ffmpeg -i "%~1" -ss %2 -to %3 -map 0 -c copy "%~n1-strih.mkv"
Tento soubor stačí pak pustit v CMD pomocí strih-do-mkv.bat "moje nahravka.ts" 00:10:30 00:32:00.
Informace o médiu:
Jedna z možností je spustit ffmpeg -i soubor. Některé informace jsou dostupné i ve vlastnostech souboru v panelu podrobnosti. Zdaleka nejlepší je si nainstalovat MediaInfo. Po nainstalovaní se umí integrovat do kontextového menu a tak lze zobrazit detaily souboru vyvoláním kontextové nabídky přímo na souboru (pravá myš -> MediaInfo). Program je v češtině a lze v něm jednoduše zjistit co je třeba remuxovat a co se zremuxovalo, jakého je soubor typu a jiné užitečné informace. Nejzajímavější zobrazovací módy jsou Základní, List, Strom a Text.
Čeština FFMpeg, CMD a bat:
Při používání českých znaků je se třeba mít na pozoru, ale zatím jsem s tím neměl problém. Do okna CMD jde psát česky, ale ne všechny programy které se přes něj dají spustit ji podporují. Naštěstí FFMpeg češtinu podporuje. S bat souborama je to trochu složitější, je třeba je ukládat ve specifickém kódování Latin II (CP852), které umí např PSPad a jiné pokročilejší editory.
V dalším článku se budu věnovat dalším úpravám mkv souborů i obecně videa a audia bez překódovávání