¿Cuál es la mejor manera de convertir un archivo mp4
en webm
sin pérdida de calidad (usando vp8
o vp9
) con ffmpeg?
Si lo hago ffmpeg -i in.mp4 out.webm
la calidad es muy mala. Puedo especificar una tasa de bits objetivo a través de -b:v
y el modo de calidad constante a través de crf
, es decir,
ffmpeg -i in.mp4 -crf 10 -b:v 1M out.webm
Esto da mejor calidad. Sin embargo, para esto tengo que buscar la tasa de bits del video de entrada (aquí 1M).
También noté que si especifica un valor mucho mayor para la tasa de bits de destino que la tasa de bits de la entrada (aquí, por ejemplo, -b:v 100M
), ffmpeg simplemente parece use aproximadamente la tasa de bits del video de entrada con vp9 o una tasa de bits ligeramente más alta con vp8. Sin embargo, esta solución no parece ser la forma prevista de hacerlo.
¿Cómo elegiría el valor de crf y por qué?
¿Existe un parámetro que elija automáticamente la tasa de bits de el archivo de entrada y un valor crf adecuado para obtener la misma calidad que el archivo de entrada?
Comentarios
- Establezca la tasa de bits en 0. Y experimente con crf . Pero su método de una tasa de bits alta también funciona, ya que el valor actúa como un techo, no como un objetivo.
- @Mulvya: ¿La tasa de bits 0 significa que no hay límite? Yo no ' t encontrar esto en la página de manual.
- Con bitrate no establecido en cero, CRF está restringido por ese valor. Con cero, ' No es. Es ' una peculiaridad de los codificadores VPn.
- De acuerdo, pero si omito el parámetro de tasa de bits por completo, la calidad se vuelve muy mala aunque yo no ' t da un límite superior para la tasa de bits.
- Enlace para 200k (ver primera opción en). Para WebM b: v 0, consulte esta página .
Respuesta
Respuesta
Utilice el modo de calidad constante de dos pasos: ¹
ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 1 -an -f webm /dev/null ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 2 output.webm
Explicación:
Establecer la tasa de bits de video en cero y al mismo tiempo especificar el CRF (factor de tasa constante) habilita el modo de calidad constante que apunta a un cierto nivel de calidad de percepción. Para VP9, el CRF puede variar de 0 (mejor calidad) a 63 (tamaño de archivo más pequeño).
Es importante establecer la tasa de bits del video en cero. Si no especifica una tasa de bits de video, el valor predeterminado es algo bajo, lo que le otorga el modo de calidad Restringido , donde cada cuadro tiene una tasa de bits máxima. Si bien eso puede ser útil para la transmisión, reduce la calidad significativamente ya que los fotogramas con mucho movimiento no tendrán el ancho de banda necesario para verse bien.
Otra parte de la razón por la que está perdiendo calidad es que webm
(VP9) prefiere codificar en dos pasadas para obtener mejores resultados. El primer paso compila estadísticas sobre el video que luego se usa en el segundo paso para hacer un video más pequeño y de mayor calidad.
Por favor, consulte la ffmpeg VP9 documentación si desea obtener más información.
Un comentario sobre la transcodificación
Por cierto, en general, la transcodificación de formatos (tomar un video comprimido y volver a comprimirlo con un códec diferente) es una mala idea ya que no solo agregará los errores normales de la codificación de video con pérdida, sino que desperdiciará bits en el nuevo formato tratando de preservar los artefactos del anterior.
Si significa «sin pérdida de calidad» literalmente
La opción -lossless 1
del codificador VP9 de ffmpeg habilita el modo de calidad sin pérdidas, pero con un aumento potencialmente enorme.
Todo lo que necesitas es esto:
ffmpeg -i input.mp4 -lossless 1 output.webm
Cuando probé -lossless 1
en un mp4
, el webm
resultante era 100 veces mayor, que no era un aceptable para mí. Sin embargo, si sus archivos mp4
ya son de muy alta calidad, espero que la diferencia de tamaño no sea tan grande.
Nota al pie 1: Si «si está usando Microsoft Windows en lugar de UNIX, cambie /dev/null
a NUL
.
Comentarios
- Excelente respuesta, gracias
-
/dev/null
? ¿Qué significa esto? ¿Cuál sería el equivalente para los usuarios de Windows? ¿Está sobrescribiendoinput.mp4
en la primera pasada? Esta respuesta necesita más explicación sobre lo que hace exactamente cada componente. No ' no ofrece a los usuarios intermedios mucha explicación de cómo funciona. - Hola Hatefriend: Mi respuesta ya incluye una sección de explicación larga más un enlace para obtener más información, así que ' prefiero no extenderla. ¿Viste la nota al pie sobre Microsoft Windows que responde a tu pregunta específica? Además, como se mencionó anteriormente, el primer paso compi les estadísticas sobre el archivo de entrada.No hay necesidad de temer que pueda sobrescribir la entrada.
- Intenté convertir el archivo .MTS a .webm usando estos dos comandos (Ubuntu 20.10, ffmpeg versión 4.2.2). Pero tengo errores: " Diseño de canal no válido 5.1 (lateral) para la familia de mapeo -1 especificada. Error al inicializar el flujo de salida 0: 1 – Error al abrir el codificador para el flujo de salida # 0: 1 – tal vez parámetros incorrectos como bit_rate, rate, width o height "
- gracias por la respuesta. Si la transcodificación es generalmente una mala idea, ¿qué recomiendas en su lugar si necesitas convertir videos mp4 a webm y videos webm a mp4?
Respuesta
En Linux, uso optimizarVideo , que es un contenedor de ffmpeg que detecta automáticamente esas configuraciones de acuerdo con Recomendaciones de Google .
El resultado es un video cuya diferencia de calidad no se puede notar, pero generalmente órdenes de magnitud más pequeñas.