Igényes ember a nyersanyag preparálására kizárólag a Shutter Encoder felület Interpolation opcióját használja. Különösen igaz ez akkor, ha éppen most ruházott be egy meglehetősen erős GPU-ba.
Nézzük, mit is jelent ez a számok nyelvén. Próbakonverzió.
– AVC/30fpsVFR/64mbps videó átkonvertálása HEVC/50fpsCFR/40mbps videóra.
– A videó hossza 42 másodperc.
– A konverzió: 44 perc, azaz az időarány gyakorlatilag 1:60.
Ez azért eléggé lelombozó eredmény. Még akkor is, ha az általában egy napokat feldolgozó videóimban kábé 5 percnyi mobilról felvett nyersanyag van csak. Mivel 1:60 az arány, így ez 5 órányi munka. Amivel nem is lenne különösebb probléma, ha tudnám kötegelni, csak hát úgy, hogy beolvasom a Shutter Encoderbe és egyenként konvertálom át a darabokat, úgy folyamatosan ott kell ülnöm mellette. Nem tudom éjszakára ráküldeni az egészet.
Ekkor jött az ötlet. Mi van a Shutter Encoder mögött? Az ffmpeg. Ami egy parancssori program. Mi lenne, ha megkeresném a megfelelő paramétereket és akkor elég lenne éjszakára csak egy parancsfájlt elindítanom? Felvetettem az ötletet a Gemininek és határozottan csillogni kezdett a szeme. Végre egy igazán nekivaló feladat!
Ehhez képest az első szkript le sem futott. Pedig kipróbáltam először a régi ffmpeg progimmal, majd miután hibára futott, lekaptam a legújabb ffmpeg-et, de azzal is hibaüzenetet kaptam. Elküldtem a Gemininek. Komolyan, érezni lehetett a sértődöttséget a válaszában. Közölte, hogy az első ffmpeg túl régi volt, azért nem ismerte az ő paraméterét, a másik meg túl új és az meg azért. Hiába, nem könnyű a programozók élete, különösen, ha szilíciumból vannak.
Küldött egy újabbat.
@echo off
mkdir "konvertalt" 2>nul
for %%f in (*.mp4) do (
echo Feldolgozas: %%f...
ffmpeg -i "%%f" -vf "minterpolate=fps=50:mi_mode=mci:mc_mode=aobmc:me_mode=bidir" -c:v libx265 -crf 20 -preset fast -c:a copy "konvertalt\%%f" -y
)
pause
Ez már lefutott és az eredményvideó minősége is megfelelt. Csak éppen a 42 másodperces videóval 1 óra 44 percet molyolt. Ez 1:148-as arány, kábé 12 órán keresztül dolgozna az 5 percnyi videóval. Hát, van még tér az optimalizálásra.
Első lépés: a minterpolate szűrő és azon belül az mi_mode=mci lecserélése. Az MCI azt jelenti, hogy Motion Compensated Interpolation, Ez a legmagasabb minőségű mód, ami pixelről pixelre elemzi a mozgást a képkockák között, és megpróbálja kiszámolni, hová mozdultak el az objektumok. 4K felbontásnál ez egy matematikai rémálom a CPU-nak, mert másodpercenként 50-szer kell elvégeznie ezt a számítást 8,3 millió pixelre. Ehelyett jön be a framerate szűrő. Ez gyakorlatilag a Shutter Encoderben a Blending algoritmus az Interpolate helyett.
Illetve vedd észre, hogy azt írtam, CPU. A fenti parancs nem használta ki a GPU-t, mint lehetőséget. Ezt is belevettük.
@echo off
mkdir "konvertalt" 2>nul
for %%f in (*.mp4) do (
echo Feldolgozas: %%f...
ffmpeg -i "%%f" -vf "framerate=fps=50" -c:v hevc_nvenc -preset p4 -rc vbr -cq 24 -b:v 32M -pix_fmt yuv420p -color_range pc -c:a copy "konvertalt\%%f" -y
)
pause
Lefutott. Piszok gyorsan: 31 másodperc. Csak hát a minőség… az nem lett jó. Blőrözött.
(Emellett vegyük észre, hogy itt történt egy apró színhelyesség-korrekció is.)
Mondjuk úgy, hogy a nemtetszésemet fejeztem ki. Maradjon inkább az Interpolate szűrő, csak valamivel gyengébb minőségben.
@echo off
mkdir "konvertalt" 2>nul
echo --- INDUL AZ OPTIMALIZALT EJSZAKAI MUSZAK ---
for %%f in (*.mp4) do (
echo Feldolgozas: %%f...
:: A minterpolate itt az alap (gyorsabb) MCI modot hasznalja, ahogy a Shutter Encoder is
ffmpeg -i "%%f" -vf "minterpolate=fps=50:mi_mode=mci" -c:v hevc_nvenc -preset p4 -rc vbr -cq 24 -b:v 32M -pix_fmt yuv420p -color_range pc -c:a copy "konvertalt\%%f" -y
)
echo --- MINDEN FAJL KESZ! ---
pause
Visszajött a minterpolate szűrő, viszont a Gemini elhagyta az “mc_mode=aobmc:me_mode=bidir” paramétereket. (Átlapolt blokk-alapú mozgáskompenzáció, illetve kétirányú becslés.)
A szkript 55 perc alatt futott le, az már közelített a Shutter Encoder eredményéhez, viszont a mozgás még mindig blőrözött.
@echo off
setlocal enabledelayedexpansion
mkdir "konvertalt" 2>nul
for %%f in (*.mp4) do (
echo Feldolgozas: %%f
ffmpeg -i "%%f" -vf "minterpolate=fps=50:mi_mode=mci:mc_mode=obmc" -c:v hevc_nvenc -preset p4 -rc vbr -cq 24 -b:v 32M -pix_fmt yuv420p -color_range pc -c:a copy "konvertalt\%%f" -y
)
pause
Látható, hogy visszakerült az mc_mode paraméter, csak egy kevésbé igényes kapcsolóval. Tulajdonképpen itt értük el az optimumot. A szkript 55 perc alatt futott le és a videó minősége is jó lett. Ezt már be tudtam vállalni. Igaz, 5,5 óra kellett a munka elvégzéséhez, de éjjeli munkánál 30 perc pluszmunka nem oszt, nem szoroz.
És akkor emlékezzünk vissza, hogyan vezettem fel ezt az írást a korábbiban?
És bár nem vagyok rá büszke, mert elképesztő, mit bénáztam…
Hol van a bénázás?
Most jön.
Ez itt a Shutter Encoder grafikus felülete. Bejelölgettem a fontosabb részeket, de most egyre hívnám fel a figyelmet, a bal felső sarokban lévő bekarikázásra. Látod? Az ott egy munkaasztal. A nagy szkriptelős felbuzdulásban nem vettem észre, hogy a Shutter Encoder nem úgy működik, hogy beolvas egy fájlt és azzal dolgozik, majd beolvashatom a következőt és így tovább, nem, a Shutter Encoder munkaasztalára tetszőleges mennyiségű fájlt be tudok olvasni (ctrl+klattyintás) és mindegyikkel elvégzi a kijelölt konverziót.
Bakker.
Az egész szkriptelés tök felesleges volt. Este bedobom mind az ötpercnyi mobiltelcsis videót, bekattintom a bekattintanivalókat, elindítom, reggelre kész. Gyorsan és jó minőségben.
A végére még valami. Írtam korábban, hogy Paul Pacifico, a Shutter Encoder fejlesztője mennyire tökéletesen ismeri az ffmpeg-et. Itt van a bizonyíték. A Geminivel összefogva sem bírtuk összerakni egy délután azt a paraméterlistát az ffmpeg mögé, amely a Shutter Encoder conform by interpolate funkciója mögött volt. Ahogy a Gemini fogalmazta, a pacáknak sikerült eltalálnia azt az arany egyensúlyt a futási idő és a minőség között, melyet nekünk nem.
Recent Comments