¿Cómo puedo reducir el tamaño de un video con ffmpeg?

201

¿Cómo puedo usar ffmpegpara reducir el tamaño de un video bajando la calidad (lo más mínimo posible, naturalmente, pero necesito que se ejecute en un dispositivo móvil que no tiene mucho espacio disponible)?

Olvidé escribir una cosa todavía. Cuando el video puede usar subtítulos (* .srt o * .sub), me gustaría convertirlos también para que se ajusten a los parámetros del archivo de video convertido.

xralf
fuente
44
No lo he usado, pero la ffmpegpágina del manual muestra una -fsopción para limitar el tamaño de salida, ¿funciona algo así ffmpeg -i in.avi -fs 100M out.avi?
Kevin
1
No lo redirigiré a la página de manual:man ffmpeg | wc -l --> 5254
3
El .avino es el problema principal ... avies solo un contenedor. El problema principal es qué códecs usa. Muchos (¿la mayoría?) .aviVids usan códecs de estilo más antiguos (por ejemplo, XviD) que están bien, pero son más grandes para la misma calidad en comparación con la generación posterior de códecs. Por lo general, puede obtener un codificación ajustada mediante el uso del H.264estándar de compresión de video (por ejemplo, códec x264) y aaccompresión para audio ... El contenedor y los códecs que use dependen de usted y su teléfono ... El .mp4contenedor está bien aceptado ... (pero su teléfono puede manejarlo: ver este enlace
Peter.O
@ Kevin Esto quiere más parámetros para la conversión.
xralf
@hesse ¿Qué significa?
xralf

Respuestas:

277

Mira esta respuesta. Citado a continuación para mayor comodidad:

Calcule la tasa de bits que necesita dividiendo 1 GB por la duración del video en segundos. Entonces, para un video de duración 16:40 (1000 segundos), use una tasa de bits de 1000000 bytes / seg:

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

Las opciones adicionales que vale la pena considerar es establecer el Factor de tasa constante, que reduce la tasa de bits promedio, pero conserva una mejor calidad. Varíe el CRF entre alrededor de 18 y 24; cuanto menor sea, mayor será la tasa de bits.

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

Varíe el códec según sea necesario: libx264 puede estar disponible si libx265 no lo está, a costa de un tamaño de archivo resultante ligeramente mayor.

Vicky Chijwani
fuente
El video de tamaño 338 MB se redujo en tamaño 130 MB. La calidad bajó rápidamente. ¿Hay alguna explicación para este proceso? El autor original no explica su directriz.
xralf
13
Segundo comando, usando -crf 24tomé un video de 255.3MB que tenía y lo reduje a 72.7MB sin disminuir notablemente la calidad. Tener un voto a favor!
Patrick Roberts
2
Impresionantemente reduje un video ~ 2G a 14MB, todavía se ve bien, este fue el primer resultado de búsqueda y es exactamente lo que estaba buscando, ¡gracias!
sinisterstuf
55
Puede ser bueno tener en cuenta que ahora puede usar libx265para una reducción de tamaño aún mayor.
ZN13
66
Utilizado ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi. Redujo un video de 100mb a 9mb. Muy poco cambio en la calidad del video. ¡Gracias!
alpha_989
32

A menos que esté buscando una tasa de bits específica, le recomendaría la -crfopción. Este es el más utilizado para la x264codificación: http://slhck.info/articles/crf

En resumen: un CRF de 23 produciría películas de calidad "DVD" (~ 700MB-1GB) y valores CRF más bajos serían de mayor calidad (archivos más grandes).

Tom Kelly
fuente
3
Dé ejemplos del comando completo en lugar de vincular a un sitio web externo (que podría romperse algún día :)
Jake Berger
1
@Vicky Chijwani proporciona el código en el ejemplo anterior. Esto se adapta mejor a un comentario, pero fue mi primera actividad en este sitio. El enlace tiene más explicaciones sobre la opción crf pero no es necesario para que el código funcione.
Tom Kelly el
27

Usted mencionó querer reducir el tamaño del archivo para que quepa más videos en un dispositivo móvil, que también es mi caso de uso. Todas las respuestas aquí son para reducir la calidad de la compresión, pero nadie ha mencionado reducir el tamaño del cuadro de video. Es mucho más rápido, de 3 a 5 veces más rápido que la recompresión en mi experiencia. Consulte los documentos de ffmpeg sobre escalado para obtener más información.

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
georgiecasey
fuente
20

Probé la mayoría de las otras respuestas propuestas a esta pregunta. Las conclusiones de los datos de prueba están a continuación. Estas son las respuestas propuestas que probé:

(BR) Modifique la tasa de bits, utilizando:

ffmpeg -i $infile -b $bitrate $newoutfile 

(CR) Varíe el factor de tasa constante, usando:

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

(SZ) Cambie el tamaño de la pantalla de video (por ejemplo, a la mitad de su tamaño de píxel), usando:

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

(BL) Cambie el perfil H.264 a "línea base", usando:

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

(DF) Use el procesamiento predeterminado de ffmpeg, usando:

ffmpeg -i $infile $outfile

DATOS

  • "tamaño": porcentaje de tamaño de píxel del video convertido en relación con el original.
  • "bitrate" - bitrates de videos originales y convertidos.
  • "definición": tamaño de píxel de los videos.
  • "convertir": tiempo para convertir el video en segundos.

Calculé la tasa de bits objetivo para (BL) utilizando el método propuesto.

=== Archivo A - Cómo el nodo está ayudando a impulsar 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

=== Archivo B - Uso de GraphQL con Angular _ Por - 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

CONCLUSIONES

  • El método (SZ) es definitivamente el método más rápido. Fue 2X a 4X más rápido. Esto puede ser un gran problema en los videos de alta definición, ya que todos los otros métodos tardaron más en convertirse que la duración real del video. Por ejemplo, el método (CR) tardó 53 minutos en convertir el video de 21 minutos.

  • El método (SZ) es definitivamente el mejor método si la definición del video es mayor que la definición de la pantalla que lo mostrará. Por ejemplo, si su teléfono solo puede mostrar una imagen de 1080p, enviarle un video de 3840x2160 es un desperdicio. Sería mejor reducir a la mitad su tamaño a 1080p.

  • Algunas de las respuestas propuestas en realidad AUMENTARON el tamaño de algunos videos. Por ejemplo, el método (BR) duplicó con creces el tamaño de la muestra de 1080p. Sin embargo, hizo que el tamaño de 2160p fuera un tercio. Para la muestra de alta definición, los métodos (CR), (BL) y (DF) AUMENTARON el tamaño del video.

Respuesta correcta (o mejor)

Siempre es mejor bajar primero la resolución al máximo admitido por su pantalla de destino.

Si desea reducir aún más el tamaño del archivo, dependerá de las elecciones personales. Puede reducir el contenido de la información o aumentar la compresión.

  • Puede reducir la resolución más si eso no es algo que le preocupa.

  • Si el video no incluye escenas de acción rápida, es posible que desee reducir la velocidad de fotogramas.

  • Si tiene un procesador potente y el espacio es el único problema, puede aumentar la tasa de compresión.

  • La velocidad de bits es una combinación de múltiples factores. Entonces, solo decirle a ffmpeg que baje la velocidad de bits puede no darle los resultados que desea.

  • Otra forma de reducir el contenido de la información es disminuir la profundidad del color. Cómo hacer esto aún no se discutió.

John Pankowicz
fuente
13

Tenga en cuenta que parece que ffmpeg ya realiza alguna optimización cuando se ejecuta sin opciones, por lo que antes de intentar usar configuraciones que no comprende o decidir perder explícitamente la información, intente con una conversión predeterminada:

ffmpeg -i input.mp4 output.mp4

En mi caso, redujo la tasa de bits tanto del video como del audio (puede verificar y comparar el archivo de entrada y salida ejecutándolos ffprobe), transformando un video de 700 Mb en uno de 60 Mb de calidad aparentemente similar.

Skippy le Grand Gourou
fuente
1
Pasé de 4Gb a 2Gb con esto, ¡gracias!
Sam Hosseini
1
(de 10Mo a 1.2Mb, ffmpeg auto convirtió mi video que estaba en VP8 a VP9 )
sodimel
Esto aumentó el tamaño de mi video de 10.8MB a 14MB
pjtnt11
3

Tengo una receta que originalmente falsifiqué para convertir los videos Motion JPEG que genera mi cámara anterior (son videos muy grandes, ya que cada cuadro es una imagen JPEG completa) a h264. Aquí hay una adaptación para otros tipos de videos (cursos, etc.).

No estoy usando ffmpeg , sino mplayer y mencoder . Primero, tenemos que demoler el audio con mplayer:

mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
  • Los parámetros -vo nully -ao nullle dicen a mplayer que no extraiga el video.

En los próximos pasos, haremos una compresión de 3 pasadas con mencoder. En el primer paso, elegiremos una compresión adecuada del modo de calidad constante ( parámetro crf ) como punto de partida:

mencoder <video> -ovc x264 \ 
         -x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 \
         -nosound -o video1.h264
  • Puede agregar el parámetro slow_firstpass a -x264encopts si está paranoico con la calidad final del video. El manual de Mencoder dice que esta opción deshabilita algunos parámetros que "mejoran significativamente la velocidad de codificación mientras tienen poco o ningún impacto en la calidad del pase final". Por lo tanto, úselo solo en el último paso.

  • Debe probar varios valores para crf : intente comenzar desde 25 y continúe incrementándolo hasta que observe los artefactos en el video resultante (los valores más altos se comprimen más). Recuerde que los pases de codificación posteriores mejorarán la calidad que ha elegido para crf .

  • Las alternativas para el preajuste veryslow son más lentas , lentas , medias , etc. Consulte el manual de mencoder para obtener la lista completa.

  • ratetol controla la variación de la tasa de bits: no estoy seguro de si estoy haciendo lo correcto aquí, pero lo configuré en el valor máximo para permitir una libertad total al mencoder para elegir la tasa de bits correcta para cada escena.

Después de la primera pasada, notará que la última línea le da la tasa de bits promedio que usará en los siguientes pasos:

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

Cambie el parámetro crf , recomendado en la primera pasada, a bitrate , requerido en las siguientes pasadas:

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

Esta codificación de segundo paso leerá las estadísticas generadas en el primer paso ( divx2pass.logy divx2pass.log.mbtree) para optimizar la compresión.

  • Tenga en cuenta que usará la misma entrada de video, no la generada por el primer paso: el video de salida del primer paso solo es útil para verificar la calidad inicial.

  • Tenga en cuenta también que pass=3( no pass=2 ) generará un nuevo archivo de estadísticas, por lo que puede repetir el último paso tantas veces como lo desee. Usualmente lo hago pass=3dos veces, siempre prestando atención al bitrate de resultados.

Mientras tanto, también puedes comprimir el audio, usando lameo oggenc:

oggenc -q<n> <audio_pcm.wav>

Finalmente, remux audio y video

mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy \
         -of lavf -lavfopts format=mp4 -o <video>.mp4
  • El -of lavf -lavfopts format=mp4genera mp4el formato de archivo usando los lavopts muxers.
Juliano B. Nequirito
fuente
3

Comprimí una presentación de video HD de 40 minutos de 505 MB a 183 MB.
Eso es como pasar de 100 MB a 36 MB.
El video original era HD y la salida era casi nula diferencia notable.
Es un archivo de video "Me gustaría conservarlo, pero HD es excesivo".
Aquí está el comando que usé con razones:

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

  • -n: evite sobrescribir archivos de salida (más seguro para las pruebas que para los lotes)
  • -loglevel error : muestra errores y oculta las filas y filas de progreso
  • -i inputfile.mp4 : nombre del archivo de entrada
  • -vcodec libx264: deslizado desde la respuesta superior de arriba
  • -crf 28: La compresión de una sola pasada con diferencia notable menor ( "0 = sin pérdida, 23 = por defecto, 51 = peor; subjetivamente rango correcto es 17- 28 " ) docs árbitro
  • -preset faster: se ve 2 veces más rápido que el tiempo de codificación predeterminado de los documentos de referencia 'medianos'
  • -tune film: especifique que la entrada es un video HQ (otras opciones incluyen 'caricatura', 'imagen fija') documentos de referencia
  • outputfilename.mp4 : Nombre del archivo de salida

Para un directorio de archivos de 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

Cuestiones:

  • Una forma más limpia de recopilar "todos los archivos de video" sin tener todas las extensiones en el comando
  • una forma más limpia de generar el nombre de archivo sin el prefijo "cc" Y poder confirmar el video antes de eliminarlo
  • .webmLos archivos no funcionan con el comando. Tuve que intercambiar "cc${i}""${i%.*}.mp4"

Handbrake es una alternativa de código abierto con una interfaz de usuario

Jake Berger
fuente
Funciona. pero lleva demasiado tiempo ¿Hay alguna mejora por menos tiempo de ejecución
Nirali
1

Escribí un script bash para reducir el tamaño del video y probar automáticamente diferentes valores crf.

Básicamente lo harás

  • elija un rango de valores crf
  • ejecuta el script
  • verifica el tamaño de los videos generados y elige el que quieras

Esto es realmente útil cuando tiene un límite de tamaño que desea alcanzar y no sabe cuál es el valor de crf que le permitirá hacerlo.

Espero que esto ayude a alguien. Compartí con mis colegas y todos lo encontraron útil.

#!/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
kalmanIsAGameChanger
fuente