VP9 do HEVC bez komprese pomocí FFMpeg

Jigdo

  • *****
  • 500
    • Zobrazit profil
VP9 do HEVC bez komprese pomocí FFMpeg
« kdy: 27. 09. 2024, 20:27:18 »
EUMETSAT maji peknou animaci pocasi ve 4K,
kterou zverejnili na YT.
https://www.youtube.com/watch?v=DAW-GpnJIgE

Uvedene video jsem si stahl ve kodeku 625 a 140
Kód: [Vybrat]
yt-dlp -f 625+140 DAW-GpnJIgE(625 ma nejvyssi video bitrate)

Kód: [Vybrat]
140     m4a   audio only      2 │    4.71MiB   129k https │ audio only           mp4a.40.2  129k 44k medium, m4a_dash
625     mp4   3840x1920   30    │ ~556.09MiB 15294k m3u8  │ vp09.00.50.08 15294k video only

a chtel bych to video dostat z VP9 do HEVC,
jelikos ten VP9 kodek nefunguje na starsich zarizenich,
ale pri konverzi na HEVC je ta ztrata kvality videt .. na 4K monitoru
z 493.5M je vysledne video v HEVC 92.1M :(
(Original VP9 video ma
Bit rate : 13.4 Mb/s
a vysledne HEVC video
Bit rate : 2 371 kb/s)
 
Napada nekoho jak to z toho VP9 dostat do HEVC
aniz by FFMpeg snizil bitrate toho videa?


Kód: [Vybrat]
ffmpeg -hide_banner \
-y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda \
-i Global.weather.2024-April-June.f625+140.[DAW-GpnJIgE].mp4 \
-strict experimental \
-map 0:0 -map 0:1 -map 0:2 \
-c:V:0 hevc_nvenc \
-c:v:1 copy \
-c:a copy \
-c:s copy \
-c:d copy \
-map_metadata 0 \
-f mp4 -movflags +faststart \
-ignore_unknown -copy_unknown \
Global.weather.2024-April-June.HEVC+140.[DAW-GpnJIgE].mp4 -v verbose
« Poslední změna: 27. 09. 2024, 20:33:35 od Jigdo »


Re:VP9 do HEVC bez komprese pomocí FFMpeg
« Odpověď #1 kdy: 27. 09. 2024, 23:05:55 »
bez hw akcelerace... to jsou uplně jiný světy co se týče kvality a rychlosti. (a číselně -vcrf u sw odpovídá  global_quality:v jinak), a hlavně používám lookahead 1 (mapuje se na LA_ICQ) . a něco jako preset jde ladit přes "TU" ("target usage" 1-7)

cuda neznám, možná má svoji sadu parametrů
ale tohle api možná doznalo změn, zprovoznění quicksync před x lety chtělo hodně laborování a explicitně uvádět spoustu boilerplate přepínačů

Re:VP9 do HEVC bez komprese pomocí FFMpeg
« Odpověď #2 kdy: 28. 09. 2024, 09:53:38 »
V tom použitém příkazu tam nikde nemáte deklarovaný bitrate, ani kvalitu u výstupního video streamu.
Navzdory nadpisu threadu to nebude HEVC bez komprese (to byste měl obří bitrate)
Také jsou tam nějaké úplně zbytečné parametry - mapování, ignore_unknown a copy_unknown se vylučují atp., experimental nepotřebujete, ale to nezpůsobuje ten problém, co řešíte.

ffmpeg má možnost určité kodeky kódovat více enkodéry. Tzn. když máte NVIDIA kartu, tak se pro HEVC (H.265) nabízí buď hevc_nvenc, nebo softwarový libx265, který funguje všude. (jsou ještě jiné alternativy jako kvazaar, svt-hevc, ale to je specifické pro konkrétní kompilaci).

Různé enkodéry jsou různě namapované na parametry řízení výst. bitrate / kvality v ffmpegu. Tzn. můžete sice použít některé parametry (např. -q:v <číslo>, -maxrate, -minrate), ale pokud tenhle konkrétní parametr není namapován, nebo enkodér není ve správném režimu, tak to nemá vůbec žádný efekt i když je uvedete.
Pak jsou tam ještě specifické parametry pro daný enkodér. Doporučuji si prohlédnout (neznamená, že je vždy dobré je nastavovat) pomocí vestavěného helpu, protože máte jistotu, že je to k té konkrétní verzi enkodéru/knihovny, co můžete použít. Např. ffmpeg -h encoder=libx265 nebo ffmpeg -h encoder=hevc_nvenc

Obecně platí, že x265 enkodér postkytuje kvalitnější výstup vzhledem k bitrate než hardwarové enkodéry (NVENC, Intel QSV, AMD AMF), ale samozřejmě výstup se kóduje déle, pokud nemáte nějaký mega stroj.
Ale ve většině případů jsou výstupy samozřejmě použitelné i s těmi hw enkodéry, jen musíte trochu přitlačit na bitrate.

U lib_x265 bych doporučil (beru standardní používání, nikoliv nějaké patologické obrazce nebo super komplikované scény, kdy se potřebujete za každou cenu trefit do co nejmenšího souboru i za cenu násobně delšího kódování třeba víceprůchodem) zůstat u CRF řízení ( vysvětlení https://slhck.info/video/2017/02/24/crf-guide.html ).
Tzn. pro váš případ, když to zjednoduším.

ffmpeg -i vstup.mp4 -c:a copy -c:v libx265 -crf 25 vystup.mp4

Čím vyšší číslo CRF, tím menší datový tok. Není to lineární a v podstatě platí, že pro menší rozlišení např. SD PAL, potřebujete vyšší CRF např. 18, a pro vyšší rozlišení pak stačí naopak nižší CRF, např. 25-28 pro UltraHD. Dolaďte podle potřeby.

U NVENC je to trochu složitější, protože CRF, q:v ignoruje. A v podstatě jsou při jednoprůchodu použitelné dva parametry: CBR, kdy se snaží udržet okolo zadaného bitrate. QP (quantization parameter), kdy se enkodér snaží udržet relativní degradaci obrazu a může fluktuovat bitrate - což je trochu podobné zmíněnému CRF a také platí, že vyšší číslo znamená vyšší degradaci a menší bitrate.

pro CBR s NVENC stačí nastavit bitrate pro stream a většinou je to naprosto dostačující
ffmpeg  -hwaccel cuda -hwaccel_output_format cuda -i vstup.mp4 -c:a copy -c:v hevc_nvenc -b:v 15M vystup.mp4

pro QP je pak potřeba přepnout režim rate control (přes parametr rc)
ffmpeg  -hwaccel cuda -hwaccel_output_format cuda -i vstup.mp4 -c:a copy -c:v hevc_nvenc -rc constqp -qp 28 \
vystup.mp4

Jak tu bylo zmíněno, tak jsou tam i další paramtery, třeba pro ten rc-lookahead (načítá snímky dopředu, aby lépe rozdistribuoval bitrate) a implicitně to pak zapíná dynamické vkládání intra a b-snímků. Což může být zajímavé pro rychle se měnící videa (což není ten případ satelitních snímků) s menším bitrate.
Případně je tam i možnost použít další specifické kvantizační mechanismy nad rámec standardního rc. spatial (v rámci snímku) a temporal (mezi snímky) přes parametry spatial_aq, resp. temporal_eq. Ale zpomalí to kódování a musíte si vyzkoušet, jestli to něco udělá.