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 -aDalší variantou je renderovat pouze část snímků – například prvních 10:
blender -b movie.blend -s 1 -e 10 -aNápověda, jak si dobře zapamtovat přepínače:
- b – background (na pozadí)
- s – 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.mp4Video 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.aacVysvětlení parametrů:
- -vn => bez videa
- -acodec copy => překopíruj existující audio stream
ffmpeg -i video.mp4 -vn -c:a copy output.aacExportová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.mp4Vysvě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ášť.
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.mp4Vysvě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
- https://hitokageproduction.com/article/16
- https://trac.ffmpeg.org/wiki/Concatenate
- https://stackoverflow.com/questions/44642227/ffmpeg-concat-command-error
- https://github.com/GDQuest/blender-sequencer-multithreaded-render
- https://stackoverflow.com/questions/9913032/how-can-i-extract-audio-from-video-with-ffmpeg
- https://superuser.com/questions/1137612/ffmpeg-replace-audio-in-video
- https://stackoverflow.com/questions/37967120/ffmpeg-convert-from-h-264-high-444-profile-to-h-264-main-profile