Pokouším se převést svou videotéku do formátu HEVC, abych získal prostor. Spustil jsem následující příkaz na všechny video soubory v mé knihovně:
#!/bin/bash for i in *.mp4; do #Output new files by prepending "X265" to the names avconv -i "$i" -c:v libx265 -c:a copy X265_"$i" done
Nyní se většina videí převádí v pořádku a kvalita je stejná jako dříve. Několik vysoce kvalitních videí (např. Jeden filmový tisk o velikosti 5 GB) však ztrácí kvalitu – video je celé pixelováno.
Nejsem si jistý, co v tomto případě udělat. Musím na svém příkazovém řádku upravit parametr crf
? Nebo něco jiného?
Jde o to, že provádím hromadnou konverzi. Potřebuji tedy metodu, kde avconv
automaticky upraví jakýkoli parametr, který vyžaduje úpravu, pro každé video.
UPDATE-1
Zjistil jsem, že crf
je knoflík, který musím upravit. Výchozí hodnota CRF je 28. Pro lepší kvalitu bych mohl použít něco menšího než 28. Například:
avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4
Problém však je, že u některých videí CRF hodnota 28 je dost dobrá, zatímco u některých videí je vyžadován nižší CRF. To je něco, co musím ručně zkontrolovat převedením malých částí velkých videí. Jak ale při hromadné konverzi zkontroluji každé video ručně? Je jejich způsob, jak avconv
inteligentně upravit CRF podle vstupního videa?
UPDATE-2
Zjistil jsem, že existuje Možnost --lossless
v x265: http://x265.readthedocs.org/en/default/lossless.html .
Nevím však, jak jej správně používat. Zkoušel jsem to použít následujícím způsobem, ale přineslo to opačné výsledky (video bylo ještě více pixelováno):
avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
Komentáře
Odpověď
Z vlastní zkušenosti, pokud chcete absolutně žádnou ztrátu kvality, –lessless is co hledáte.
Nejste si jisti avconv
, ale zadaný příkaz vypadá stejně jako FFmpeg
. V FFmpeg
můžete předat parametr takto:
ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv
Most x265
(možnosti bez hodnoty) lze specifikovat takto (kromě těch, které jsou pouze pro CLI, ty se používají pouze přímo s x265
binárním).
S touto cestou se rád podělím o své zkušenosti s x265
kódováním. U většiny videí (ať už WMV, MPEG nebo AVC) /H.264) Používám crf=23
. x265
rozhoduje o ostatních parametrech a obvykle to dělá dost dobrou práci.
Avšak často, než se rozhodnu překódovat celé video, otestuji svá nastavení převedením malé části příslušného videa. Zde je příklad, předpokládejme, že soubor mkv s proudem 0 je video, proud 1 jako zvuk DTS a stream 2 jako podtitul:
ffmpeg -hide_banner \ -ss 0 \ -i "INPUT.mkv" \ -attach "COVER.jpg" \ -map_metadata 0 \ -map_chapters 0 \ -metadata title="TITLE" \ -map 0:0 -metadata:s:v:0 language=eng \ -map 0:1 -metadata:s:a:0 language=eng -metadata:s:a:0 title="Surround 5.1 (DTS)" \ -map 0:2 -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \ -metadata:s:t:0 filename="Cover.jpg" -metadata:s:t:0 mimetype="image/jpeg" \ -c:v libx265 -preset ultrafast -x265-params \ crf=22:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 \ -c:a copy \ -c:s copy \ -t 120 \ "OUTPUT.HEVC.DTS.Sample.mkv"
Všimněte si, že zpětná lomítka se v dlouhém příkazu přerušují, dělám to, abych mi pomohla sledovat různých bitů komplexního vstupu CLI. Než to vysvětlím řádek po řádku, část, kde převádíte jen malou část videa, je druhý řádek a druhý poslední řádek: -ss 0
znamená hledat na 0 sekund před začne dekódovat vstup a -t 120
znamená zastavit zápis na výstup po 120 sekundách. Můžete také použít časové formáty hh: mm: ss nebo hh: mm: ss.sss.
Nyní řádek po řádku:
-
-hide_banner
bráníFFmpeg
zobrazovat při spuštění informace o sestavení. Jen to nechci vidět, když v konzole přejdu nahoru; -
-ss 0
se pokusí o 0 sekund před zahájením dekódování vstupu. Všimněte si, že pokud tento parametr dostane po vstupním souboru a před výstupním souborem, stane se možností výstupu a řekneffmpeg
dekóduje a ignoruje vstup do x sekund a poté začne psát na výstup. Jako možnost vstupu je méně přesná (protože hledání není ve většině formátů kontejnerů přesné), ale nezabere téměř žádný čas.Jako možnost výstupu je velmi přesná, ale trvá značnou dobu dekódování celého streamu před stanoveným časem a pro účely testování nechcete ztrácet čas; -
-i "INPUT.mkv"
: Určete vstupní soubor; -
-attach "COVER.jpg"
: K výstupu připojte obrázek obalu (miniaturu, plakát, cokoli). obrázky obalů se obvykle zobrazují v průzkumnících souborů; -
-map_metadata 0
: Kopírování všech metadat ze vstupu 0, což je v tomto příkladu pouze vstup; -
-map_chapters 0
: Kopírovat přes informace o kapitole (jsou-li k dispozici) ze vstupu 0; -
-metadata title="TITLE"
: Nastavte název videa; -
-map 0:0 ...
: Namapujte stream 0 na vstup 0, což znamená, že chceme, aby byl na výstup zapsán první proud ze vstupu. . Jelikož tento stream je video stream, je to první video stream ve výstupu , tedy specifikátor streamu:s:v:0
. Nastavte jeho jazyk tag to English; -
-map 0:1 ...
: Podobně jako řádek 8, namapujte druhý stream (zvuk DTS) a nastavte jeho jazyk a název (pro snazší identifikaci při výběru od hráčů); -
-map 0:2 ...
: Podobně jako řádek 9, kromě toho, že tento stream má podtitul; -
-metadata:s:t:0 ...
: Nastavit metadata pro obal. To je vyžadováno pro formát kontejneru mkv; -
-c:v libx265 ...
: možnosti video kodeku. Je to tak dlouhé, že jsem to rozdělil na dva řádky. Toto nastavení je dobré pro vysoce kvalitní rozmazané video (1080p) s minimálním pruhem v gradientu (což x265 saje). Jedná se s největší pravděpodobností o přehnané přehrání DVD, televizních pořadů a telefonních videí. Toto nastavení je většinou ukradeno z tohoto příspěvku Doom9 ; -
crf=22:...
: Pokračování video kodeku parametry. Podívejte se na výše uvedený příspěvek na fóru; -
-c:a copy
: Copy over audio; -
-c:s copy
: Kopírovat přes titulky; -
-t 120
: Přestat psát na výstup po 120 sekundách, což nám poskytne 2minutový klip pro náhled kvality transkódování; -
"OUTPUT.HEVC.DTS.Sample.mkv"
: Název výstupního souboru. Názvy svých souborů označuji videokodekem a primárním zvukovým kodekem.
Fíha. Toto je moje první odpověď, takže pokud mi něco chybí, zanechte prosím komentář. Nejsem odborník na produkci videa, jsem jen člověk, který je příliš líný na to, aby sledoval film vložením disku do přehrávače.
PS. Možná tato otázka patří jinam, protože není silně spjatý s Unixem & Linux.
Komentáře
- Přesně to, co jsem hledal ! Pěkné pokrytí možností. Víte, zda se ffmpeg bude bránit
c:s copy
, pokud nebude mít obsah titulků? - @ElderGeek Ne, ffmpeg něco řekne, pouze pokud má tato možnost nějaký účinek.
- @TheBitByte Ano a ne, myslím. ‚ Nechcete bezztrátové soubory h265. Je to ‚ pouze surový bitový tok bez jakéhokoli druhu komprese. Je to ‚ obrovské. Z toho, co chápu o implementaci h265 nebo konkrétně x265, nejde o bezztrátovou kompresní metodu. Jakýkoli stupeň komprese bude mít za následek ztrátu informací, nikoli však nutně ztrátu kvality zobrazení. Ale ‚ nejsem odborník na témata h265, takže je ‚ možné, že mi něco uniklo
- @ TheBitByte Nemyslím si ‚ že v h265 je bezztrátová úroveň komprese. U možnosti bez komprese je ‚ pouze
--lossless
. Marně jsem hledal bezztrátovou konverzi z h264 na h265 a to, co jsem se ‚ dozvěděl, mi říká, že je to ‚ matematicky nemožné. - Měli byste opravdu upravit příkaz obsahující přepínač
--lossless
z této odpovědi, protože tam jako odpověď na tuto otázku zníte jako vy ‚ říká to ‚ bezztrátovou kompresi, která je zavádějící.
Odpovědět
Nedávno jsem prošel problémem s překódováním celého svého katalogu videí na HEVC. Používám https://github.com/FallingSnow/h265ize s následujícím nastavením.
h265ize -v -m medium -q 20 -x –no-sao – -aq-mode 3 –delete –stats
-v – Podrobný výstup
-m střední – střední rychlost kódování (menší vyšší kvalita, něco pomalejšího, co zjistím, nestojí za rozdíl v čase a kvalitě)
-q 20 – použitý CRF, 20 je přibližně 18 v x264, ale hej.Toto je pro obsah 1080p (90% mé televize), pro své filmy v rozlišení 4K používám 22
-x – Použijte centrální definované příkazy x265
–no-sao vypne Sample Adaptive Offset (zlepšuje rychlost kódování)
–aq-mode 3 – používá adaptivní kvantizaci s automatickým rozptylem, pomáhá 8bitovým kódováním, zejména v tmavých oblastech, zastaví většina páskování, ke kterému může dojít (na úkor doby kódování)
–delete – nahraďte kódovací soubor kódovaný soubor (před použitím tohoto otestujte)
–stats – Vypíše statistiky do souboru CSV v kořenovém adresáři cesty, ze které jste běhali.
Rychlost kódování je na mém zařízení přibližně 30 sn./s (pro většinu věcí 1080p). Dual Xeon E5 2687W v2, ale vynucuji proces FFMPEG, aby nepoužíval první stranu jednoho z procesorů (je to můj server Plex, takže se musíte ujistit, že v případě potřeby existuje režie pro transkódování při přehrávání atd.)
Ano, chvíli trvalo, než jsem většinu převedl, a teď mám naplánovaný úkol, který běží dvakrát denně, aby se kódovaly věci z toho dne na x265.
Úspora místa byly obrovské. Můj původní SAN byl na 20Tb použití, nyní je to kolem 12, ale samozřejmě to bylo přidáno také s 6 měsíci více obsahu.
Začal jsem také překódovat všechny své filmy, ale to je probíhající proces, protože musím identifikovat úrovně kvality (Radarr naštěstí štítky pak pěkně) a použít jedno ze tří nastavení překódování:
-m slower -q 18 -x --no-sao --aq-mode 3
pro transkódování 720p
-m medium -q 20 -x --no-sao --aq-mode 3
pro 1080p
-m medium -q 22 -x --no-sao
pro 2160p
Doufám, že to některým lidem pomůže. Křičte, pokud někdo potřebuje ručně to všechno nastavíte. A než vše zakódujete na x265, přemýšlejte o přehrávání, pokud klient nepodporuje nativní x265, pak může být transcade nákladná z hlediska CPU a kvality.
Komentáře
- S x265 2.4 a novějšími (s novými tabulkami lambda , které poskytují ostřejší kódování), je SAO obvykle dobrá věc pro kvalitu na bitrate. Stále se mírně rozmazává, ale omezuje jiné artefakty natolik, aby to stálo za to.
-
-q 20
není CRF 20, ‚ s konstantní řízení rychlosti QP . Výchozí a doporučený režim, CRF, zvyšuje QP u scén s vysokou složitostí, takže
netráví příliš mnoho bitů ve scénách, které jsou příliš těžké zakódovat. (Chcete-li se blížit jednotnému QP, zvyšteqcomp
z výchozí hodnoty 0,6 na možná 0,7 nebo 0,8. Blíže na 1,0 je blíže CQP.)
odpověď
Správná syntaxe pro povolení bezztrátového režimu kodéru x265 v souboru ffmpeg je -x265-params lossless=1
(je třeba přidat =1
).
Nicméně pro bezztrátové kódování existují lepší volby kodeků. Testováním jsem zjistil, že FFV1 komprimuje mnohem lépe (velikost souboru = ~ 80% x265) alespoň u některých druhů videa (pokud je pro obě zvoleno nejlepší nastavení kodeky). A také funguje rychleji a (AFAIK) není zatížen patenty. To znamená, že je ve všech ohledech lepší než bezztrátový H.265 pro archivaci videa. Kompromisem je však kompatibilita se současným softwarem a hardwarem pro přehrávání.
--lossless
může ve skutečnosti soubor zvětšit, pokud dekóduje dříve ztrátový kodek a poté podporuje to, co udělal bezztrátově dekódovat. Kvalita zůstane přesně stejná jako vstup.