Saltar al contenido

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

Valeria, miembro de este gran staff, nos ha hecho el favor de escribir este post porque conoce a la perfección dicho tema.

Solución:

Esta respuesta fue escrita en 2009. Desde 2013, un formato de video mucho mejor que H.264 está ampliamente disponible, a saber, H.265 (mejor porque comprime más para la misma calidad o brinda mayor calidad para el mismo tamaño). Para usarlo, reemplace el códec libx264 con libx265 y empuje más la palanca de compresión aumentando el valor de CRF; agregue, digamos, 4 o 6, ya que un rango razonable para H.265 puede ser de 24 a 30. Tenga en cuenta que más bajo Los valores de CRF corresponden a más alto bitrates, y por lo tanto producir más alto videos de calidad.

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

Para ver esta técnica aplicada con el formato H.264 anterior, consulte esta respuesta, que se cita a continuación para su conveniencia:

Calcula la tasa de bits que necesitas dividiendo el tamaño de tu objetivo (en bits) por la duración del video (en segundos). Por ejemplo, para un tamaño de destino de 1 GB (un gigabyte, que es de 8 gigabits) y 10000 segundos de vídeo (2 h 46 min 40 s), utilice una tasa de bits de 800000 bit / s (800 kbit / s):

ffmpeg -i input.mp4 -b 800k output.mp4

Otras opciones que pueden valer la pena considerar es configurar el factor de velocidad constante, que reduce la velocidad de bits promedio, pero conserva una mejor calidad. Varíe el CRF entre 18 y 24, cuanto más bajo, mayor es la tasa de bits.

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

Mencionaste querer reducir para que quepan 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 compresión, pero nadie ha mencionado la reducción del tamaño del cuadro de video. Es mucho más rápido, de 3 a 5 veces más rápido que recomprimir 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

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

(BR) Modifique la tasa de bits, usando:

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 de base”, usando:

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

(DF) Use el procesamiento ffmpeg predeterminado, usando:

ffmpeg -i $infile $outfile

DATOS

  • “tamaño”: tamaño de píxel porcentual del video convertido en relación con el original.
  • “tasa de bits”: tasas de bits 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) usando 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 – Usando 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

CONCLUSIONES

  • El método (SZ) es definitivamente el método más rápido. Fue de 2 a 4 veces 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 3840×2160 es un desperdicio. Lo mejor sería reducir la mitad de 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 reducir primero la resolución al máximo admitido por la pantalla de destino.

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

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

  • 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 tasa de bits es una combinación de múltiples factores. Por lo tanto, es posible que solo decirle a ffmpeg que reduzca la velocidad de bits no le dé los resultados que desea.

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

Si entiendes que te ha sido provechoso nuestro artículo, sería de mucha ayuda si lo compartes con más desarrolladores y nos ayudes a dar difusión a este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *