Qual è il modo migliore per convertire un file mp4 in webm senza perdita di qualità (utilizzando vp8 o vp9) con ffmpeg?

Se lo faccio ffmpeg -i in.mp4 out.webm la qualità è pessima. Posso specificare un bitrate target tramite -b:v e la modalità di qualità costante tramite crf, ovvero

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

Questo dà una migliore qualità. Tuttavia per questo devo cercare il bitrate del video in ingresso (qui 1M).

Ho anche notato che se specifichi un valore molto più grande per il bitrate target rispetto al bitrate dellinput (qui per esempio -b:v 100M), ffmpeg sembra usa approssimativamente il bitrate del video in ingresso con vp9 o leggermente superiore con vp8. Tuttavia questa soluzione non sembra essere il modo previsto per farlo.

Come sceglieresti il valore crf e perché?

Cè un parametro che sceglie automaticamente il bitrate di il file di input e un valore crf adatto per ottenere la stessa qualità del file di input?

Commenti

  • Imposta il bitrate su 0. E sperimenta con crf . Ma anche il tuo metodo di bitrate alto funziona, poiché il valore funge da limite e non da target
  • @Mulvya: bitrate 0 significa che non ci sono limiti? Non lho fatto ' Non trovarlo nella pagina man.
  • Con il bitrate non impostato a zero, CRF è vincolato da quel valore. Con zero, ' Non lo è. ' una stranezza degli encoder VPn.
  • Ok, ma se ometto completamente il parametro bitrate la qualità diventa pessima anche se non lho fatto ' t fornire un limite massimo per il bitrate.
  • Link per 200k (vedi prima opzione su). Per WebM b: v 0, consulta questa pagina .

Risposta

Risposta

Utilizza la modalità qualità costante a due passaggi: ¹

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 

Spiegazione:

Limpostazione del bitrate video su zero specificando anche il CRF (Constant Rate Factor) abilita la modalità di qualità costante che mira a un certo livello di qualità percettiva. Per VP9, il CRF può variare da 0 (qualità migliore) a 63 (dimensione file più piccola).

È importante impostare il bitrate video su zero. Se non specifichi un bitrate video, il valore predefinito è qualcosa di basso che ti dà la modalità di qualità Constrained , in cui ogni frame ha un bitrate massimo. Sebbene possa essere utile per lo streaming, riduce notevolmente la qualità poiché i fotogrammi con molto movimento non avranno la larghezza di banda necessaria per avere un bellaspetto.

Un altro motivo per cui stai perdendo qualità è che webm (VP9) preferisce codificare in due passaggi per ottenere i migliori risultati. Il primo passaggio compila le statistiche sul video che vengono poi utilizzate nel secondo passaggio per creare un video più piccolo e di qualità superiore.

Consulta la ffmpeg VP9 documentazione se desideri saperne di più.

Qualche parola sulla transcodifica

A proposito, in generale, i formati di transcodifica (prendendo un video compresso e ricomprimendolo con un codec diverso) è una cattiva idea poiché non solo aggiungerai i normali errori dalla codifica video con perdita, ma sprecherai bit nel nuovo formato cercando di preservare gli artefatti dal vecchio.

Se tu significa letteralmente “senza perdita di qualità”

Lopzione -lossless 1 del codificatore VP9 di ffmpeg abilita la modalità di qualità senza perdita, ma con un aumento potenzialmente enorme della dimensione del file.

Tutto ciò di cui hai bisogno è questo:

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

Quando ho provato -lossless 1 su un mp4, il webm risultante era 100 × più grande, che non era un accettabile per me. Tuttavia, se i tuoi file mp4 sono già di altissima qualità, prevedo che la differenza di dimensioni non sarà così grande.


Nota 1: se tu “stai utilizzando Microsoft Windows invece di UNIX, modifica /dev/null in NUL.

Commenti

  • Ottima risposta, grazie
  • /dev/null? Cosa significa? Quale sarebbe lequivalente per gli utenti Windows? Stai sovrascrivendo input.mp4 al primo passaggio? Questa risposta richiede ulteriori spiegazioni su cosa sta facendo esattamente ogni componente. Non ' offre agli utenti intermedi molte spiegazioni su come funziona.
  • Ciao Hatefriend: La mia risposta include già una lunga sezione di spiegazione più un collegamento per ulteriori informazioni, quindi ' preferirei non prolungarla. Hai visto la nota a piè di pagina relativa a Microsoft Windows che risponde alla tua specifica domanda? Inoltre, come detto sopra, il primo passaggio compi le statistiche sul file di input.Non cè bisogno di temere che possa sovrascrivere linput.
  • Ho provato a convertire il file .MTS in .webm usando questi due comandi (Ubuntu 20.10, ffmpeg versione 4.2.2). Ma ho degli errori: " Layout canale non valido 5.1 (laterale) per la famiglia di mappatura specificata -1. Errore di inizializzazione del flusso di output 0: 1 – Errore durante lapertura del codificatore per il flusso di output n. 0: 1 – forse parametri errati come bit_rate, rate, width o height "
  • grazie per la risposta. se la transcodifica è generalmente una cattiva idea, cosa consiglieresti invece se devi convertire i video mp4 in webm e i video webm in mp4?

Risposta

Su Linux utilizzo optimVideo , che è un wrapper attorno a ffmpeg che rileva automaticamente queste impostazioni in base a I consigli di Google .

Il risultato è un video di cui non si riesce a distinguere la differenza di qualità, ma solitamente di ordini di grandezza inferiore.

Logo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *