Jaký je nejlepší způsob převodu souboru mp4 na webm bez ztráty kvality (pomocí vp8 nebo vp9) s ffmpeg?

Pokud ano ffmpeg -i in.mp4 out.webm kvalita je velmi špatná. Cílový datový tok mohu určit pomocí -b:v a režimu konstantní kvality pomocí crf, tj.

ffmpeg -i in.mp4 -crf 10 -b:v 1M out.webm

Tím získáte lepší kvalitu. K tomu však musím vyhledat datový tok vstupního videa (zde 1M).

Také jsem si všiml, že pokud zadáte mnohem větší hodnotu cílového datového toku, než je datový tok vstupu (zde například -b:v 100M), zdá se, že ffmpeg použijte přibližně datový tok ze vstupního videa s vp9 nebo mírně vyšší datový tok s vp8. Toto řešení se však nezdá být zamýšleným způsobem.

Jak byste vybrali hodnotu crf a proč?

Existuje parametr, který automaticky zvolí bitrate vstupní soubor a vhodnou hodnotu crf pro získání stejné kvality jako vstupní soubor?

Komentáře

  • Nastavit bitrate na 0. A experimentovat s crf . Ale funguje i vaše metoda vysokého datového toku, protože hodnota funguje jako strop, nikoli jako cíl.
  • @Mulvya: Znamená bitrate 0, že neexistuje žádný limit? ' Toto nenajdete na stránce manuálu.
  • Pokud bitový tok není nastaven na nulu, je CRF omezen touto hodnotou. S nulou je ' s ne. ' je to vtípek kodérů VPn.
  • ok, ale pokud úplně vynechám parametr bitrate, kvalita se velmi zhorší, i když jsem to neudělal ' udává horní limit pro bitrate.
  • Odkaz pro 200 kB (viz první opti na). WebM b: v 0 najdete na této stránce .

Odpovědět

Odpověď

Použijte dvouprůchodový režim konstantní kvality: ¹

ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 1 -an -f webm /dev/null ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 2 output.webm 

Vysvětlení:

Nastavením přenosové rychlosti videa na nulu a zároveň zadáním faktoru CRF (Constant Rate Factor) povolíte režim konstantní kvality, který cílí na určitou úroveň kvality vnímání. U VP9 se CRF může pohybovat od 0 (nejlepší kvalita) do 63 (nejmenší velikost souboru).

Je důležité nastavit bitovou rychlost videa na nulu. Pokud nezadáte bitovou rychlost videa, použije se výchozí nízká úroveň, která vám poskytne omezený režim kvality, kde každý snímek má maximální bitovou rychlost. I když to může být užitečné pro streamování, výrazně to snižuje kvalitu, protože snímky se spoustou pohybu nebudou mít šířku pásma potřebnou k tomu, aby vypadaly dobře.

Další část důvodu, proč ztrácíte kvalitu, je to, že webm (VP9) dává přednost kódování ve dvou průchodech, aby bylo dosaženo nejlepších výsledků. První průchod sestavuje statistické údaje o videu, které se poté použije ve druhém průchodu k vytvoření videa menší a vyšší kvality.

Přečtěte si dokumentaci ffmpeg VP9 pokud se chcete dozvědět více.

Slovo o překódování

Mimochodem, obecně, překódujte formáty (pořízení komprimovaného videa a jeho opětovné komprimování pomocí different codec) je špatný nápad, protože nejenže přidáte běžné chyby ze ztrátového kódování videa, ale také zbytečné bity v novém formátu se snažíte uchovat artefakty ze starého.

Pokud znamená „bez ztráty kvality“ doslovně

Možnost -lossless 1 kodéru VP9 ffmpeg umožňuje bezztrátový režim kvality, ale s potenciálně enormním nárůstem velikosti souborů.

Vše, co potřebujete, je toto:

ffmpeg -i input.mp4 -lossless 1 output.webm 

Když jsem zkusil -lossless 1 na nekvalitní mp4, výsledný webm byl 100 × větší, což nebyl pro mě přijatelné. Pokud jsou však vaše mp4 soubory již velmi vysoké kvality, očekávám, že rozdíl ve velikosti nebude tak velký.


Poznámka pod čarou 1: Pokud „namísto UNIXu používám Microsoft Windows, změňte /dev/null na NUL.

Komentáře

  • Skvělá odpověď díky
  • /dev/null? Co to znamená? Jaký by byl ekvivalent pro uživatele systému Windows? Přepisujete input.mp4 při prvním průchodu? Tato odpověď vyžaduje další vysvětlení, co přesně jednotlivé komponenty dělají. Neposkytuje ' zprostředkujícím uživatelům mnoho vysvětlení jak to funguje.
  • Ahoj nenávistný přítel: Moje odpověď již obsahuje dlouhou sekci s vysvětlením a odkaz na další informace, takže ' bych to už neudělal. Viděli jste poznámku pod čarou týkající se systému Microsoft Windows, která odpovídá na vaši konkrétní otázku? Také, jak bylo uvedeno výše, kompilace prvního průchodu statistika vstupního souboru.Není třeba se bát, že by to mohlo přepsat vstup.
  • Zkoušel jsem převést soubor .MTS na .webm pomocí těchto dvou příkazů (Ubuntu 20.10, ffmpeg verze 4.2.2). Mám ale chyby: " Neplatné rozložení kanálu 5.1 (boční) pro zadanou rodinu mapování -1. Chyba při inicializaci výstupního proudu 0: 1 – Chyba při otevírání kodéru pro výstupní proud # 0: 1 – možná nesprávné parametry, jako je bit_rate, rychlost, šířka nebo výška "
  • děkuji za odpověď. pokud je překódování obecně špatný nápad, co doporučujete místo toho, pokud potřebujete převést videa mp4 na webm a videa webm na mp4?

Odpovědět

V systému Linux používám optimizeVideo , což je obal kolem ffmpeg, který automaticky detekuje tato nastavení podle Doporučení společnosti Google .

Výsledkem je video, jehož rozdíl v kvalitě nelze poznat, ale obvykle je řádově menší.

Logo

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *