Come posso ridurre le dimensioni di un video con ffmpeg?


201

Come posso utilizzare ffmpegper ridurre le dimensioni di un video abbassando la qualità (il più minimamente possibile, naturalmente, ma ne ho bisogno per funzionare su un dispositivo mobile che non ha molto spazio disponibile)?

Ho dimenticato di scrivere ancora una cosa. Quando il video può usare i sottotitoli (* .srt o * .sub) vorrei convertirli anch'essi per adattarli ai parametri del file video convertito.


4
Non l'ho usato ma la ffmpegpagina man mostra -fsun'opzione per limitare le dimensioni dell'output, funziona qualcosa di simile ffmpeg -i in.avi -fs 100M out.avi?
Kevin

1
Non ti reindirizzerò alla pagina man:man ffmpeg | wc -l --> 5254

3
Non .aviè il problema principale ... aviè solo un contenitore. Il problema principale è quali codec usi. Molti (la maggior parte?) .aviVideo usano codec di vecchio stile (es. XviD) che vanno bene, ma sono più grandi per la stessa qualità rispetto alla generazione successiva di codec. In genere puoi ottenere un codifica stretta usando lo H.264standard di compressione video (es. codec x264) e aaccompressione per audio .. Il contenitore e i codec che usi dipende da te e dal tuo telefono ... Il .mp4contenitore è ben accettato .. (ma il tuo telefono può gestirlo: vedi questo link
Peter.O

@Kevin Questo richiede più parametri per la conversione.
xralf,

@hesse Cosa significa?
xralf,

Risposte:


277

Vedi questa risposta Citato di seguito per comodità:

Calcola il bitrate necessario dividendo 1 GB per la lunghezza del video in secondi. Quindi, per un video di lunghezza 16:40 (1000 secondi), utilizzare un bitrate di 1000000 byte / sec:

ffmpeg -i input.mp4 -b 1000000 output.mp4

Ulteriori opzioni che potrebbero essere prese in considerazione sono l'impostazione del fattore di frequenza costante, che riduce la velocità di trasmissione media, ma mantiene una qualità migliore. Varia il CRF tra 18 e 24 circa: più basso è, maggiore è il bitrate.

ffmpeg -i input.mp4 -vcodec libx265 -crf 20 output.mp4

Modificare il codec secondo necessità - libx264 potrebbe essere disponibile se libx265 non lo è, al costo di una dimensione file leggermente più grande risultante.


Il video di dimensioni 338 MB è stato ridotto su dimensioni 130 MB. La qualità si è ridotta rapidamente. C'è qualche spiegazione per questo processo? L'autore originale non spiega le sue linee guida.
xralf,

13
Secondo comando, usando -crf 24ho preso un video di 255.3MB che avevo e lo ho ridotto a 72.7MB senza abbassare notevolmente la qualità. Avere un voto!
Patrick Roberts,

2
Incredibilmente ridotto un video di ~ 2G a 14 MB, sembra ancora buono, questo è stato il primo risultato di ricerca ed è esattamente quello che stavo cercando, grazie!
sinisterstuf

5
Potrebbe essere utile notare che ora è possibile utilizzare libx265per una riduzione delle dimensioni ancora maggiore.
ZN13

6
Usato ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi. Ha ridotto un video da 100mb a 9mb .. Pochissimi cambiamenti nella qualità del video. Grazie!
alpha_989,

32

A meno che tu non stia cercando un bitrate specifico, consiglierei l' -crfopzione. Questo è il più comunemente usato per la x264codifica: http://slhck.info/articles/crf

In breve: un CRF di 23 renderebbe un film di qualità "DVD" (~ 700 MB-1 GB) e valori CRF più bassi sarebbero di qualità superiore (file più grandi).


3
Fornisci esempi del comando completo invece di collegarti a un sito Web esterno (che potrebbe interrompersi un giorno :)
Jake Berger,

1
@Vicky Chijwani fornisce il codice nell'esempio sopra. Questo è più adatto a un commento, ma è stata la mia prima attività su questo sito. Il collegamento contiene ulteriori spiegazioni sull'opzione crf ma non è necessario per far funzionare il codice.
Tom Kelly,

27

Hai detto di voler ridurre le dimensioni dei file per adattare più video su un dispositivo mobile, che è anche la mia custodia. Tutte le risposte qui sono per ridurre la qualità di compressione, ma nessuno ha menzionato la riduzione delle dimensioni del frame video. È molto più veloce, da circa 3 a 5 volte più veloce di ricomprimere nella mia esperienza. Vedi i documenti di ffmpeg sul ridimensionamento per maggiori informazioni.

ffmpeg -i input.mkv -vf "scale=iw/2:ih/2" half_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/3:ih/3" a_third_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/4:ih/4" a_fourth_the_frame_size.mkv

20

Ho testato la maggior parte delle altre proposte di risposta a questa domanda. Le conclusioni dei dati di test sono di seguito. Queste sono le risposte proposte che ho testato:

(BR) Modifica il bitrate, usando:

ffmpeg -i $infile -b $bitrate $newoutfile 

(CR) Varia il fattore di tasso costante, usando:

ffmpeg -i $infile -vcodec libx264 -crf 23 $outfile

(SZ) Cambia la dimensione dello schermo del video (ad esempio a metà della sua dimensione in pixel), usando:

ffmpeg -i $infile -vf "scale=iw/2:ih/2" $outfile

(BL) Cambia il profilo H.264 in "baseline", usando:

ffmpeg -i $infile -profile:v baseline $outfile

(DF) Utilizza l'elaborazione predefinita di ffmpeg, usando:

ffmpeg -i $infile $outfile

DATI

  • "dimensione": percentuale di pixel del video convertito rispetto all'originale.
  • "bitrate" - bitrate dei video originali e convertiti.
  • "definizione" - dimensione in pixel dei video.
  • "converti" - tempo di convertire il video in secondi.

Ho calcolato il bitrate target per (BL) usando il metodo proposto.

=== File A - In che modo il nodo aiuta a spingere Angular-Fnbixa7Ts6M.mkv ===

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        64152 kb    214%       76%        40%        83%        76%
bitrate     411 kb/s    883        313        165        342        313
definition  1920x1080   1920x1080  1920x1080  960x540    1920x1080  1920x1080
convert     --          648        509        225        427        510

=== File B - Utilizzo di GraphQL con Angular _ By - Lee Costello-OGyFxqt5INw.mkv ===

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        410301 kb   33%        109%       28%        143%       109%
bitrate     2687 kb/s   880        2920       764        3843       2920
definition  3840x2160   3840x2160  3840x2160  1920x1080  3840x2160  3840x2160   
convert     --           2307       3188       1116       2646       3278

CONCLUSIONI

  • Il metodo (SZ) è sicuramente il metodo più rapido. Era da 2 a 4 volte più veloce. Questo può essere un problema per i video ad alta definizione, poiché tutti gli altri metodi hanno impiegato più tempo per la conversione rispetto alla lunghezza effettiva del video! Ad esempio, il metodo (CR) ha impiegato 53 minuti per convertire il video di 21 minuti.

  • Il metodo (SZ) è sicuramente il metodo migliore se la definizione del video è più ampia della definizione dello schermo che lo visualizzerà. Ad esempio, se il telefono è in grado di visualizzare solo un'immagine a 1080p, l'invio di un video di 3840x2160 è solo uno spreco. Sarebbe meglio dimezzarne le dimensioni a 1080p.

  • Alcune delle risposte proposte hanno effettivamente AUMENTATO le dimensioni di alcuni video. Ad esempio, il metodo (BR) ha più che raddoppiato la dimensione del campione 1080p. Ha tuttavia reso la dimensione di 2160p un terzo. Per il campione ad alta definizione, i metodi (CR), (BL) e (DF) hanno AUMENTATO le dimensioni del video.

Risposta corretta (o migliore)

È sempre meglio abbassare prima la risoluzione al massimo supportato dal display di destinazione.

Se si desidera ridurre ulteriormente le dimensioni del file, dipenderà dalle scelte personali. Puoi ridurre il contenuto delle informazioni o aumentare la compressione.

  • Puoi abbassare di più la risoluzione se questo non è qualcosa che ti riguarda.

  • Se il video non include scene d'azione rapide, potresti voler ridurre la frequenza dei fotogrammi.

  • Se si dispone di un potente processore e lo spazio è l'unico problema, è possibile aumentare il tasso di compressione.

  • La velocità in bit è una combinazione di più fattori. Quindi, dire semplicemente a ffmpeg di ridurre il bit rate potrebbe non darti i risultati desiderati.

  • Un altro modo per ridurre il contenuto delle informazioni è ridurre la profondità del colore. Come fare questo non è stato ancora discusso.


13

Si noti che sembra ffmpeg già che esegua qualche ottimizzazione quando eseguito senza opzioni, quindi prima di provare a utilizzare le impostazioni che non si capiscono o si decide di perdere esplicitamente informazioni, provare una conversione predefinita:

ffmpeg -i input.mp4 output.mp4

Nel mio caso ha ridotto il bitrate sia del video che dell'audio (è possibile controllare e confrontare il file di input e output eseguendolo ffprobesu di essi), trasformando un video da 700 Mb in uno da 60 Mb di qualità apparentemente simile.


1
Siamo andati da 4Gb a 2Gb con questo, grazie !!
Sam Hosseini,

1
(da 10Mo a 1,2Mb, ffmpeg ha convertito automaticamente il mio video che era in VP8 in VP9 )
sodimel

Ciò ha aumentato le dimensioni del mio video da 10,8 MB a 14
MB

3

Ho una ricetta che ho originariamente forgiato per me stesso al fine di convertire i video Motion JPEG generati dalla mia vecchia fotocamera (sono video molto grandi, poiché ogni fotogramma è un'intera immagine JPEG) in h264. Ecco un adattamento per altri tipi di video (corsi, ecc.).

Non sto usando ffmpeg , ma mplayer e mencoder . Innanzitutto, dobbiamo demuxare l'audio con mplayer:

mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
  • I parametri -vo nulle -ao nullindicano a mplayer di non estrarre video.

Nei passaggi successivi, eseguiremo una compressione a 3 passaggi con mencoder. Al primo passaggio sceglieremo una compressione della modalità qualità costante adatta ( parametro crf ) come punto di partenza:

mencoder <video> -ovc x264 \ 
         -x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 \
         -nosound -o video1.h264
  • È possibile aggiungere il parametro slow_firstpass a -x264encopts se si è paranoici con la qualità finale del video. Il manuale di Mencoder afferma che questa opzione disabilita alcuni parametri che "migliorano significativamente la velocità di codifica pur avendo un impatto minimo o nullo sulla qualità del passaggio finale". Quindi, usalo solo nell'ultimo passaggio.

  • Dovresti provare diversi valori per crf - prova a partire da 25 e continua ad aumentarlo fino a notare artefatti nel video risultante (valori più alti comprime di più). Ricorda che i successivi passaggi di codifica miglioreranno la qualità che hai scelto per crf .

  • Le alternative per il preset Veryslow sono più lente , lente , medie ecc. Vedere il manuale del mencoder per l'elenco completo.

  • ratetol controlla la variazione del bitrate - non sono sicuro se sto facendo la cosa giusta qui, ma l'ho impostato sul valore massimo per consentire a mencoder la totale libertà di scegliere il bitrate giusto per ogni scena.

Dopo il primo passaggio, noterai che l'ultima riga fornisce il bitrate medio che utilizzerai nei passaggi successivi:

(...)
x264 [info]: kb/s:526.43

Modificare il parametro crf , consigliato al primo passaggio, in bitrate , richiesto ai passaggi successivi:

mencoder <video> -ovc x264 \
       -x264encopts slow_firstpass:ratetol=100:preset=veryslow:bitrate=526:pass=3 \
       -nosound -o video2.h264

Questa codifica del secondo passaggio leggerà le statistiche generate al primo passaggio ( divx2pass.loge divx2pass.log.mbtree) al fine di ottimizzare la compressione.

  • Nota che utilizzerai lo stesso input video, non quello generato dal primo passaggio - il video di output del primo passaggio è utile solo per verificare la qualità iniziale.

  • Si noti inoltre che il pass=3( non pass=2 ) genererà un nuovo file di statistiche, quindi è possibile ripetere l'ultimo passaggio quante volte si desidera. Di solito lo faccio pass=3due volte, prestando sempre attenzione al bitrate del risultato.

Nel frattempo, puoi anche comprimere l'audio, usando lameo oggenc:

oggenc -q<n> <audio_pcm.wav>

Infine, rimodelleremo audio e video

mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy \
         -of lavf -lavfopts format=mp4 -o <video>.mp4
  • Il -of lavf -lavfopts format=mp4genera mp4formato di file utilizzando i lavopts muxer.

3

Ho compresso una presentazione video HD di 40 minuti da 505 MB a 183 MB
È come passare da 100 MB → 36 MB.
Il video originale era HD e l'output era una differenza evidente quasi zero.
È un file video "Mi piacerebbe tenermi in giro, ma l'HD è eccessivo."
Ecco il comando che ho usato per motivi:

ffmpeg -n -loglevel error -i inputfile.mp4 -vcodec libx264 -crf 28 -preset faster -tune film outputfilename.mp4

  • -n: evita di sovrascrivere i file di output (più sicuro per i test e poi il batch)
  • -loglevel error : mostra gli errori e nasconde le righe e le righe di avanzamento
  • -i inputfile.mp4 : nome del file di input
  • -vcodec libx264: scorrere dalla risposta in alto sopra
  • -crf 28: Compressione single-pass con notevole differenza minore ( "0 = senza perdite, 23 = default, 51 = peggiore; soggettivamente gamma sano è 17- 28 " ) documenti ref
  • -preset faster: Sembra 2x più veloce del tempo di codifica predefinito di 'medium' docs ref
  • -tune film: specifica l'input è un video HQ (altre opzioni includono 'cartoon', 'stillimage' ..) documenti di riferimento
  • outputfilename.mp4 : nome del file di output

Per una directory di file video:

for i in *.{avi,flv,m4v,mov,wmv,mp4,MP4,TS,mkv}; do ffmpeg -n -loglevel error -i "$i" -vcodec libx264 -crf 28 -preset faster -tune film "cc${i}"; done

Problemi:

  • un modo più pulito di raccogliere "tutti i file video" senza avere tutte le estensioni nel comando
  • un modo più pulito di generare il nome del file senza il prefisso "cc" E di essere in grado di confermare il video prima di eliminarlo
  • .webmi file non funzionano con il comando. Ho dovuto scambiare "cc${i}""${i%.*}.mp4"

Il freno a mano è un'alternativa open source con un'interfaccia utente


Funziona. ma ci vuole troppo tempo. C'è qualche miglioramento per meno tempo di esecuzione
Nirali


1

Ho scritto uno script bash per ridurre le dimensioni del video e provare automaticamente diversi valori crf.

Fondamentalmente lo farai

  • scegli un intervallo di valori crf
  • eseguire lo script
  • controlla le dimensioni dei video generati e scegli quello che desideri

Questo è davvero utile quando hai un limite di dimensioni che vuoi raggiungere e non sai qual è il valore crf che ti permetterà di farlo.

Spero che questo possa aiutare qualcuno. Ho condiviso con i miei colleghi e tutti l'hanno trovato utile.

#!/bin/bash

# bigger values of crf will lead to a bigger compression (smaller video size)
#for i in 1 2 3 4 5
for i in {25..28}
do
# you can remove the option -y if you want to be asked if to overwrite a file with the same name (leave the -y only if you understand what you are doing, otherwise you might rewrite an important file)
   ffmpeg -y -i NAMEOFTHEVIDEOTOCOMPRESS.mp4 -c:v libx264 -crf $i -preset veryfast -profile:v baseline -level 3.0 -strict -2 out_$i.mp4
   printf "\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Done compression at crf=$i \n\n"
done
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.