¿Cómo puedo usar ffmpeg
para 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.
video
ffmpeg
compression
xralf
fuente
fuente
ffmpeg
página del manual muestra una-fs
opción para limitar el tamaño de salida, ¿funciona algo asíffmpeg -i in.avi -fs 100M out.avi
?man ffmpeg | wc -l --> 5254
.avi
no es el problema principal ...avi
es solo un contenedor. El problema principal es qué códecs usa. Muchos (¿la mayoría?).avi
Vids 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 delH.264
estándar de compresión de video (por ejemplo, códecx264
) yaac
compresión para audio ... El contenedor y los códecs que use dependen de usted y su teléfono ... El.mp4
contenedor está bien aceptado ... (pero su teléfono puede manejarlo: ver este enlaceRespuestas:
Mira esta respuesta. Citado a continuación para mayor comodidad:
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.
fuente
-crf 24
tomé un video de 255.3MB que tenía y lo reduje a 72.7MB sin disminuir notablemente la calidad. Tener un voto a favor!libx265
para una reducción de tamaño aún mayor.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!A menos que esté buscando una tasa de bits específica, le recomendaría la
-crf
opción. Este es el más utilizado para lax264
codificación: http://slhck.info/articles/crfEn 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).
fuente
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.
fuente
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:
(CR) Varíe el factor de tasa constante, usando:
(SZ) Cambie el tamaño de la pantalla de video (por ejemplo, a la mitad de su tamaño de píxel), usando:
(BL) Cambie el perfil H.264 a "línea base", usando:
(DF) Use el procesamiento predeterminado de ffmpeg, usando:
DATOS
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 ===
=== Archivo B - Uso de GraphQL con Angular _ Por - Lee Costello-OGyFxqt5INw.mkv ===
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ó.
fuente
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: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.fuente
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:
-vo null
y-ao null
le 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:
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:
Cambie el parámetro crf , recomendado en la primera pasada, a bitrate , requerido en las siguientes pasadas:
Esta codificación de segundo paso leerá las estadísticas generadas en el primer paso (
divx2pass.log
ydivx2pass.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
( nopass=2
) generará un nuevo archivo de estadísticas, por lo que puede repetir el último paso tantas veces como lo desee. Usualmente lo hagopass=3
dos veces, siempre prestando atención al bitrate de resultados.Mientras tanto, también puedes comprimir el audio, usando
lame
ooggenc
:Finalmente, remux audio y video
-of lavf -lavfopts format=mp4
generamp4
el formato de archivo usando los lavopts muxers.fuente
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 referenciaoutputfilename.mp4
: Nombre del archivo de salidaPara 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:
.webm
Los 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
fuente
Deberá usar la codificación de 2 pasadas para "ajustar" un video dentro de un tamaño de archivo designado (tasa de bits), sin reducir la calidad demasiado drásticamente. Este es un tema bastante detallado: http://web.archive.org/web/20171130050515/http://www.mpabo.com/2014/12/14/ffmpeg-and-x264-encoding-guide/
fuente
Escribí un script bash para reducir el tamaño del video y probar automáticamente diferentes valores crf.
Básicamente lo harás
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.
fuente