Zrychlení renderování v Blenderu pomocí příkazové řádky a ffmpeg

Autor: | 19. 6. 2021 | IT, Linux, Video

Štítky: blender | ffmpeg | linux | ubuntu

Před nějakou dobou jsem se začal seznamovat s Blenderem. Osobně se mi moc líbí a vřele rád bych ho používal na editaci všech videí. Bohužel nemám na notebooku moc výkonnou grafickou kartu a tak je editace či renderování videí rychlejší v jiných nástrojích, jako je například Kdenlive. Hledal jsem nástroje, jak zrychlit renderování v Blenderu a tady jsou tipy na zrychlení z příkazové řádky.

Blender a spuštění renderování z příkazové řádky

Renderování videí jsem začal spouštět přes příkazovou řádku. Nepotřebuji vidět, jak se renderuje snímek po snímku a mít spuštěné grafické prostředí Blenderu. V grafickém prostředí si nachystám, co se má jak renderovat a spuštění renderování provádím přes příkazovou řádku. Nejprve testuju pár prvních snímků, abych se ujistil, že jsem na nic nezapomněl. A když to vypadá dobře, tak spustím renderování celé. Co to přináší? Pro mě větší pohodlnost a efektivitu. Přes den nachystám několik souborů *.blend a večer je zařadím v jednoduchém skriptu do fronty. A ráno je hotovo. Nemusím nic obsluhovat a spouštět grafické rozhraní k tomu, abych spustil renderování dalšího souboru. Pokud bych chtěl začít s paralelizací svépomocí, tak bych spustil 2 instance Blenderu s tím, že bych polovinu snímků renderoval v jedné instanci a další polovinu v druhé. Jako poslední bych vyrendrované video spojil pomoci ffmpegu do jednohou souboru. Základní použití příkazové řádky je jednoduché. Tohle spustí renderování na pozadí a použije všechno co bylo nastaveno v grafickém režimu:
blender -b movie.blend -a
Další variantou je renderovat pouze část snímků – například prvních 10:
blender -b movie.blend -s 1 -e 10 -a
Nápověda, jak si dobře zapamtovat přepínače:
  • b – background (na pozadí)
  • – start frame
  • e – end frame
  • a – já jsem si zapamtoval all, ale ve skutečnosti je to render anim – renderování animace od začátku do konce

Blender power sequencer render – bpsrender

Instalace nástroje je jednoduchá a je pospána zde. Nástroj slouží k paralelizaci renderování. V zásadě rozseká celé renderované video na několik částí. Nad každou částí spustí renderování zvlášť a na konci výstup spojí do jednoho videa.Párkrát jsem nástroj vyzkoušel a ještě možná otestuji. Když pracuji s vystřiháváním videa z green screnu, tak tento nástroj nevyužívám, protože procesor je maximálně vytížen už při klasickém renderování. Od BPSRenderu jsem čekal zrychlení spíš při jednoduché editaci videí. Nicméně ani u klasické editace videí nástroj nevyužívám tak, jak jsem původně očekával. Je to dáno tím, že i tak je procesor vytížen na 60-70% a ani při paralelním zpracování nedosahuje rychlost takových výsledků, jako Kdenlive. Nápověda použití prakticky stačí k jednoduchému použití. Většinou jsem používal jenom parametr -w na určení počtu instancí, které mají běžet paralelně.
usage: bpsrender [-h] [-o OUTPUT] [-w WORKERS] [-v] [--dry-run] [-s START]
                 [-e END] [-m] [-c] [-d] [-j]
                 blendfile

Multi-process Blender VSE rendering - will attempt to create a folder called
`render` inside of the folder containing `blendfile`. Insider `render` another
folder called `parts` will be created for storing temporary files. These files
will be joined together as the last step to produce the final render which
will be stored inside `render` and it will have the same name as `blendfile`

positional arguments:
  blendfile             Blender project file to render.

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                        Output folder (will contain a `bpsrender` temp folder
                        forrendering parts).
  -w WORKERS, --workers WORKERS
                        Number of workers in the pool (for video rendering).
  -v, --verbose         Increase verbosity level (eg. -vvv).
  --dry-run             Run the script without actual rendering or creating
                        files and folders. For DEBUGGING purposes
  -s START, --start START
                        Start frame
  -e END, --end END     End frame
  -m, --mixdown-only    ONLY render the audio MIXDOWN
  -c, --concatenate-only
                        ONLY CONCATENATE the (already) available video chunks
  -d, --video-only      ONLY render the VIDEO (implies --concatenate-only).
  -j, --join-only       ONLY JOIN the mixdown with the video. This will
                        produce the final render

Ffmpeg

Ffmpeg je velmi užitečný nástroj. Má mnoho přepínačů a rozhodně není mým cílem všechny explicitně zdokumentovat. Sepíšu však co se mi na který úkon hodilo, protože se k příkladům sám budu rád vracet.

Ffmpeg a spojování více videí do jednoho

Pro pospojování videí dohromady nejprve musím vytvořit soubor, ve kterém bude pořadí a cesty jednotlivých videí. Soubor pojmenujme například videoList.txt a jeho obsah bude vypadat například takto:
file 'path/video1.mp4'
file 'path/video2.mp4'
Pak už stačí tento příkaz:
ffmpeg -f concat -safe 0 -i videoList.txt -c copy finalVideo.mp4
Video se nepřekódovává – pouze se kopíruje a spojí dohromady. Z povahy této věci předpokládám, že video1 a video2 by mělo být ve stejném formátu a kodeku. Více příkladů, jak spojovat videa pomocí ffmpegu je popsáno v dokumentaci. Soubor videoList.txt může obsahovat relativní i absolutní cesty. Pokud jsou cesty relativní, není potřeba parametr -safe 0. Při generování souboru videoList.txt se může hodit také automatické generování, pokud chci spojit větší množství videí. K tomu poslouží tento jednoduchý cyklus:
for f in *.mp4; do echo "file '$f'" >> videoList.txt; done

Vyexportování zvuku z videa

Tato varianta vyexportuje zvuk z videa z mobilu bez reenkódování audia:
ffmpeg -i video.mp4 -vn -acodec copy vystupni-audio.aac
Vysvětlení parametrů:
  • -vn => bez videa
  • -acodec copy => překopíruj existující audio stream
Alternativní příkaz je:
ffmpeg -i video.mp4 -vn -c:a copy output.aac
Exportování zvuku s překódováním do jiného formátu:
ffmpeg -i video.mp4 -vn -c:a mp3 output.mp3

Výměna zvukové stopy ve videu za jinou

Dostal jsem se k video záznamu, ve kterém byla zvuková stopa plná šumu. Nemělo smysl kvůli tomu renderovat celo video znovu. Vyexportoval jsem zvukovou stopu, vyčistil šum pomocí Audacity a následně chtěl v původním videu nahradit původní zvukovou stopu novou.
ffmpeg -i video-se-spatnym-zvukem.mp4 -i audio-opraveny-zvuk.aac -c:v copy -c:a copy -map 0:v:0 -map 1:a:0 new.mp4
Vysvětlení příkazu:
  • -map 0:v:0 mapuje první vstupní soubor (index 0) a jeho video stream na první (index 0) souboru na výstupním videu
  • -map 1:a:0 mapuje druhý vstupní soubor (index 1) a jeho audio stream na první (index 0) audio stream na výstupním videu
  • -shortest přepínač je možné použít, pokud by audio bylo delší než video a chtěl bych audio zkrátit podle obrazu
  • -c copy zajistí překopírování video stopy a audio stopy bez reenkódování. V příkazu jsem to rozepsal pro audio a video zvlášť.
A proč tento způsob? Důvod je rychlost. Renderování a překódování videa ve videoeditoru by zabralo víc času než prosté vykopírování video stopy a spojení s novou zvukovou.

Překódování rozlišení videa ze 4K do HD

Začal jsem renderovat videa ve 4k rozlišení a někdy je potřebuju předělat do HD (1920×1080). Nemá kvůli tomu smysl otevírat a nastavovat video editor – postačí program ffmpeg.
ffmpeg -i video4k.mp4 -c:a copy -c:v libx264 -s:v 1920x1080 output.mp4
Vysvětlení parametrů:
  • -c:a copy překopíruje audio – to nepotřebuji reenkódovat
  • -c:v libx264 video se musí zmenšit a tady volím formát kódování vide. Jedna se o H.264 (MPEG-4 AVC) – aktuálně hojně používaný kodek na mobilních telefonech a internetu všeobecně. V tomto kodeku mám i vstupní video.
  • -s:v 1920×1080 písmeno s znamená scale. Změní tedy rozlišení vstupního videa na 1920×1080. Počítám, že vstupní video bylo 4k a zachovávám poměr stran. Ještě docela rychlé použití se nabízí alternativní přepínač, který udělá to samé: -s hd1080

Překódování videa pro web – WhatsApp

Při jednom nahrávání video-manuálu jsem narazil na to, že jsem video nemohl poslat přes WhatsApp. Když jsem hledal v čem je problém, tak byl v tom, že obrazové snímky byly uloženy ve formátu Planar 4:4:4 YUV a na web se hodí komprimovaný formát Planar 4:2:2 YUV – bližší diskuse zde. Tento příkaz mi pomohl video překódovat. Zároveň se zmenšila velikost výsledného videa o více jak 75%.
ffmpeg -i video4k.mp4 -c:v libx264 -c:a aac -pix_fmt yuv422p output.mp4

Užitečné zdroje

Další články