Come considerare bitrate, -maxrate e -bufsize di un video per il web


13

Sto usando ffmpeg per codificare i miei video per caricarli sul web. Ho visto questo post sull'uso di ffmpeg, ma non ho capito bene come considerare i valori.

Supponiamo di avere un video di dimensioni 70 MB con una durata di 4 minuti. Come faccio a prendere in considerazione il valore di questi flag: -b:v, -maxratee -bufsizeper questo comando?

ffmpeg -i input -codec:v libx264 -profile:v main -preset slow -b:v ? -maxrate ? -bufsize ? -vf "scale=720:trunc(ow/a/2)*2" -threads 0 -codec:a libfdk_aac -movflags +faststart output

O c'è qualche valore normale, come per i crfvalori sono 19-24? Gradirei davvero il tuo aiuto e la tua guida.


La codifica video è un'arte e ci sono centinaia di parametri da padroneggiare. Si noti che la codifica a due passaggi offrirà (molto) migliore qualità e compressione nella maggior parte degli scenari rispetto alla riproduzione con bitrate. Solitamente la dimensione finale e il bitrate video dipendono principalmente dalle dimensioni dell'uscita video. ffmpeg è di solito abbastanza intelligente da scegliere il massimo e il bitrate se gli dici di mantenere la stessa qualità video. Si noti inoltre che la creazione di un video con larghezza 480px è abbastanza buona nella maggior parte degli scenari e che farà risparmiare molta più larghezza di banda rispetto alla riproduzione con bitrate.
earizon

1
@earizon Sono d'accordo, la codifica video è un'arte e 480 di solito è abbastanza buono. Tuttavia, mi piace anche avere risoluzioni più elevate perché non uso più un CRT a 640x480. È sicuramente un modo migliore per ridurre le dimensioni piuttosto che armeggiare con i bitrate, ma ancora una volta mi piacciono le opzioni.
Wyatt8740,

Risposte:


20

Dipende molto dalla tua velocità di upload.

bufsizedeterminerà quanto è religioso ffmpeg nel mantenere costante il tuo bitrate. Se si imposta un bufsize64k, come da FFmpeg Wiki: Limitando il bitrate in uscita , calcolerà il suo bitrate corrente ogni 64 kilobyte e si adatterà di conseguenza. Le dimensioni più piccole bufsizepossono essere dannose per la qualità in quanto non consentono uno spazio sufficiente tra i controlli per x264 per apportare modifiche improvvise - otterrai blocchi.

Se il tuo maxrateè 640kbps e il tuo bufsizeè 64k, verrebbe controllato ogni decimo di secondo x264. Questo non è ottimale - FFmpeg Wiki: la codifica per i siti di streaming consiglia di eseguirlo ogni 1-2 secondi. Se ciò non avesse senso, pensalo come maxrate/ bufsize= frequenza dei controlli. Mantieni questa frequenza tra 1 e 2 secondi come regola empirica.

Se imposti entrambi maxratee bufsize, dovresti:

  • impostato maxratesu qualunque sarà la velocità di upload più bassa (nell'esempio della wiki di ffmpeg , questo è l'80% della velocità di upload totale, ma il tuo chilometraggio può variare).
  • impostato bufsizesu un valore compreso tra il tuo maxrate(un secondo) e il doppio maxrate(2 secondi). Se questo non è ancora abbastanza basso, abbassare il valore maxratee quindi reimpostare di bufsizeconseguenza.

Quindi, dovrai giocare un po 'in giro, ma dal momento che devi iniziare da qualche parte, inizierei solo con maxratecirca 600k, che di solito era abbastanza soddisfacente per me prima che usassi crftutto.

Se lo desideri, puoi provare valori più bassi per bufsize, come ogni tre o quattro secondi, solo per vedere come il valore cambia l'aspetto del tuo output. Quindi puoi determinare quanto dovresti preoccuparti per il tuo video.

In realtà, non esiste un valore normale: ciò che crffa è ottimizzare l'output in base a ciò che ritiene sia la dimensione del buffer migliore per mantenere la velocità impostata. Cerca di mantenere le dimensioni del file più basse mantenendo una certa qualità, a scapito di picchi occasionali.


1
Non dovresti "impostare bufsize in un punto compreso tra lo stesso del tuo massimo (un secondo) e metà del tuo massimo (2 secondi)" be "impostare bufsize in un punto tra lo stesso del tuo massimo (un secondo) e due volte il tuo massimo (2 secondi) "?
Ely,

@Ely penso che tu abbia ragione. Il mio lo farebbe ogni mezzo secondo. Lo aggiusterò!
Wyatt8740,

@ Wyatt8740 Siamo spiacenti, ero molto occupato. Solo una domanda però. Se uso crf, quindi non ho bisogno di specificare bitrate, buffsizee maxrate? E se è così, quale è più efficiente (usare crfo bitrate, buffsizee maxrate)?
Robin,

@Robin Puoi usare bufsize e maxrate con crf. Ricorda, crf regolerà il bitrate al volo per adattarlo a una certa qualità, e se parti del video sono molto complesse, il bitrate scatterà alle stelle e probabilmente non lo vorrai, quindi meglio "metti un lucchetto" con bufsize e maxrate (ma non troppo rigoroso, o il tuo video sembrerà una merda! :))
Ely

@Robin corretto, non dovresti usare crf con gli altri. Tuttavia, è possibile se si desidera vincolarlo. crf cerca di mantenere una qualità costante - puoi forzarlo a farlo entro i limiti con bufsizee maxrate. Non è necessario bitrate, però. Come ha detto Ely, lo renderà migliore per lo streaming.
Wyatt8740,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.