Kifejlesztettünk egy alkalmazást a .mov forrásfájlok átkódolására .ogg, .mp4 és .webm kimenetre. Jelenleg AWS EC2 g2.8xlarge példányon fut. Működik (igen!).
Kérdésem: Annak ellenére, hogy átadom a -threads 0
fájlt az ffmpeg parancsnak (valójában a konfiguráció a php-ffmpeg fájlban), a futási folyamat néha csak egyetlen magon fut. Miért történik ez? Lásd az alábbi kimenetet a htop
parancsból:
Amint láthatja , A # 21-es mag maximalizálva van. Néhány másodperc múlva át fog váltani egy másikra, ahelyett, hogy maximalizálnám az összeset, ahogy szeretném, és nagyban felgyorsítja a kódolási folyamatomat. A helyzet átmeneti; egyes futások során az összes processzor t kibővítették, de mások alatt nem, és csak az egyik processzort használjuk. Egy kollégám megemlítette, hogy talán az a kodek, amelyet egyes formátumoknál használunk, nem támogatja a többszálas végrehajtást a kódolás során, bár még nem tudom ellenőrizni, hogy ezt a viselkedést még megfigyelem-e.
Ez a helyzet? Ha igen, akkor a fenti formátumok mely kodekei lehetővé teszik számunkra, hogy átkódolják ezeket a célformátumokat, miközben kihasználják a az összes rendelkezésre álló hardverünk? A php-ffmpeg számára beállított alapértelmezett kodekek alább vannak;
Video Audio Ogg libtheora libvorbis WebM libvpx libvorbis X264 libx264 libfaac
Frissítés
A futó folyamatokat tekintve az alábbiak jelentik az MP4 számára futtatott ffmpeg parancsot (amely jelenleg telíti mind a 32 magot):
Ezt a parancsot nem közvetlenül készítem, a php-ffmpeg
van, bár úgy gondolom, hogy legalább csekély mértékű irányítással rendelkezem azzal, ami megy benne (például fogalmam sincs, miért van az elején több -metadata:s:v:0
bejegyzés)
Megjegyzések
- ‘ sok yuck-faktor van abban a parancssorban, a duplikált opciókon kívül (
-s
háromszor , a végleges más méretű). Egy csomó argumentum kifejezett beállítása az alapértelmezett értékükre (pl.-i_qfactor
,-subq
,-qcomp
) furcsa, és rossz eredményeket hozhat a jövőbeli libx264 használatával. (Valószínűleg nem, de csak azért, mert a libx264 nagyjából kész, és stabil, nincs nagy fejlesztés alatt. Ha ilyesmit csinálna az x265-hez, az rossz lenne.) Egyébként a 2-pass 1200k rendben van, de lehet, hogy inkább a targetet -minőségi crf. Nem ad meg ‘ t-preset
. 🙁 -
libfaac
nem ‘ t olyan jó, mintlibfdk_aac
. Ha ‘ ezt fizetős szolgáltatásban használja, akkor ‘ ellenőriznie kell a libfdk_aac engedélyét. Ez a cmdline is hiányzik-movflags +faststart
- ‘ az is lehetséges, hogy az ffmpeg több kimenetet is produkáljon ugyanabból bemenet. Csak a output-options output-fájlnév szekvenciája legyen a parancssorban. Összességében tehát
nem vagyok nagy hatással a php-ffmpeg-re, ha az ‘ s az a fajta cmdline, amellyel előáll. Lehet, hogy másképp is használhatja, hogy egyszerre több kimenetet generáljon, tehát nem lenne ‘ t legyen egyszálú theora lépés. Mindenesetre, ha működik, akkor nagyszerű, de vigyázzon a kódoló alapértelmezéseinek változásaira, és az x264subme
szintek jelentéseinek megváltoztatására, olyan módon, ahogyan én an cmdline fáj a minőség.
Válasz
BTW, ez a kérdés jobb lehet stackoverflow esetén, vagy esetleg unix.stackexchange, vagy esetleg serverfault. Úgy gondolom, hogy ez a webhely kevésbé azokra a kérdésekre összpontosít, amelyek nem tartalmaznak kreatív érdemeken vagy legalábbis perceptuális videó / hangminőségen alapuló döntéseket. Mindazonáltal a technikai részletekről szólok, ezért válaszolni fogok.
-threads 0
. Ha kódolásának szűk keresztmetszete van egyszálú szűrőn vagy dekóderen, akkor az egyik mag teljes terhelését és sok más magnak a könnyű terhelését fogja látni.
Egy dolgot megtehet, hogy ellenőrizze a kimenő videó mediainfóját. Az x264 a h.264 fejléc ASCII karakterláncában hagyja a beállításait. Tehát vagy strings -n20
, vagy mediainfo
:
... Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : Progressive Bits/(Pixel*Frame) : 0.051 Stream size : 455 MiB (89%) Writing library : x264 core 146 r2538+1 d48ec67 Encoding settings : cabac=1 / ref=6 / deblock=1:0:0 / analyse=0x3:0x133 / me=umh / subme=10 / psy=1 / psy_rd=0.70:0.10 / mixed_ref=1 / me_range=24 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-3 / threads=4 / lookahead_threads=1 / sliced_threads=0 / nr=50 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=5 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=1 / crf=22.5 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=3:0.60 Color primaries : BT.709 Transfer characteristics : BT.709 Matrix coefficients : BT.709
Megjegyzés a “szálak = 4” benne. Azt hiszem, ezt kézzel állítottam be a négymagos i5 2500k-n, ahelyett, hogy az x264-nek az alapértelmezett CPU-kat használnám * 1.5, mivel CPU-intenzív szűrők (hqdn3d és lanczos-downscale) futottak.
Egyébként, A libx264-nek egy olyan előre beállított beállítással, mint a slower
, nem gondja lehet a sok mag elfoglaltságában. A kódolásnak vannak olyan részei, amelyek eredendően sorosak (pl. A végső bitfolyam CABAC kódolása), ezért egy olyan nagy bitrátájú videó, amely nem tölt sok CPU-idejű referenciát (high subme
) több képkockára (high ref
) előfordulhat, hogy a tiédhez hasonló terhelési minta jelenik meg (egy szál 100% -os CPU-t használ, mások nem).
I “Nem vagyok 100% -ig biztos abban, hogy a gyorsabb presetek kevésbé párhuzamosak, de tudom, hogy a CABAC soros.
A tömeges párhuzamosság érdekében a libx264 egy csomó RAM-ot használhat a keretek megtartásához, és 2 percig keresgélhet. vagy több GOP-t, és függetlenül kódolja azokat. Ennek ellenére nincs lehetősége az ilyen módon történő működésre.
A SOK mag használatának egyik módja az, hogy több különálló kódot futtat párhuzamosan, ahelyett, hogy egyetlen, az összes magot használó egyetlen kódolás sorozata lenne. Ez csak akkor működik, ha több bemeneti fájlja van, amelyeket külön kódolni szeretne. Kereskedjen a menetes rezsivel szemben a nagyobb memóriakapacitással és sávszélességgel (kihatással van a gyorsítótárra, kivéve, ha ez egy különálló L3-mal és DRAM-mal rendelkező sokfoglalatos rendszeren van) A CPU-k minden egyes csoportjához és a folyamatok a magokhoz vannak rögzítve, így az egyik kódolás a magokat használja az egyik foglalatban, a másik pedig a másikat).
Megjegyzések
Válasz
A libtheora egyszálú. Van egy többszálas kísérleti felépítés, de nincs fenntartva. Azt javaslom, hogy futtassuk párhuzamosan a többi kóddal. Ha lehetséges, használja a libfdk-aac-t a libfaac felett is.Sokkal nagyobb hanghűség ugyanabban a bitráta mellett.
-preset veryfast
. Ha igen, akkor a bemenet dekódolása lehet az egyszálas szűk keresztmetszet. Vagy ahogy mondtam, talán lassú szűrő.-movflags +faststart
megfelelőjét egy másik muxerrel. Azt hiszem, olvastam erről valamit. Egyébként, ha ‘ Ha az mp4-et kiírja, akkor biztosan ki kell küldenie egy fájlba, hogy az ffmpeg elé tudja tenni amoov
atomot, és az adatokat átkeverje. amikor elkészült a kódolás.)