Remuxování do MKV s FFMpeg a jiné uprávy videa

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é souboryPrů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.

Test správného nastavení PATH pro FFMpeg

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í

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

This site uses Akismet to reduce spam. Learn how your comment data is processed.