Configuración de transcodificación estándar de FFMPEG

Estoy trabajando en un proyecto que proporciona transmisión de video a los usuarios a través de Internet en navegadores web y dispositivos móviles.

Estoy usando el siguiente FFMPEGcomando de muestra para transcodeel video:

ffmpeg -y -i inputvideo.mp4 -async 1 -metadata:s:v:0 start_time=0 
-s 1280x720 -vcodec libx264 -strict experimental -pix_fmt yuv420p 
-profile:v baseline -movflags +faststart -acodec aac -profile:a aac_low 
-b:v 2000k -refs 6 -coder 1 -sc_threshold 40 -flags +loop -me_range 16 
-subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -trellis 1 -b:a 128k outputvideo.mp4

El comando se genera dinámicamente usando lenguaje de programación después de obtener los detalles del video una vez cargados. Lo que estoy haciendo es restablecer la tasa de bits, la altura y el ancho del video usando la siguiente configuración:

Si height >= 720luego lo establece en 720, el ancho se establecerá automáticamente de acuerdo con la altura y bit-rateserá 5000k,

Si height >= 480luego lo establece en 480, el ancho se establecerá automáticamente de acuerdo con la altura y bit-rateserá 2500k,

Si height >= 360luego lo establece en 360, el ancho se establecerá automáticamente de acuerdo con la altura y bit-rateserá1000k

Obtuve esta lógica de este enlace .

Sin embargo, quiero degradar la calidad del video en un 25-30 % más, ya que los videos fijos tienen un tamaño mayor del que supongo que obtendré después de la transcodificación y costará más los cargos por datos.

Mientras lo buscaba, encontré otro enlace y tiene una tasa de bits diferente a la que estoy usando. No estoy seguro de cuál es mejor.

¿Alguien puede sugerirme cómo reducir el tamaño de los videos en un 25-30% más que la configuración actual sin afectar más la calidad del video?

Respuestas (1)

En lugar de usar una tasa de bits constante, intente usar calidad constante ( también conocido como factor de tasa constante o crf).

Entonces, en lugar de -b:v 2000usar -crf 23(ajuste el número para cambiar la calidad, más alto es más pequeño/menor calidad y más bajo es más grande/mejor calidad).

La calidad constante generalmente le da más valor a sus bits, ya que escatima en la tasa de bits donde realmente no se necesita. También elimina la necesidad de secuencias de comandos adicionales para diferentes tamaños, ya que reducirá automáticamente la tasa de bits para tamaños de fotogramas más pequeños.

También puede usar los ajustes preestablecidos x264, como -preset slowero -preset veryslowpara obtener x264 para dedicar más tiempo a la optimización. También elimina la necesidad de agregar todas las banderas de codificación adicionales: los ajustes preestablecidos son básicamente algunas banderas de codificación listas para usar (presumiblemente hechas por personas que saben lo que están haciendo). Más sobre la codificación x264 aquí

Entonces su comando podría verse así:

ffmpeg -y -i inputvideo.mp4 -async 1 -metadata:s:v:0 start_time=0 -s 1280x720 -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -movflags faststart -profile:a aac_low -preset slower -crf 23 -b:a 128k outputvideo.mp4

No creo que necesites la -strict-experimentalbandera, a menos que tengas una versión antigua de ffmpeg.

+1 para -crf. Si tiene tiempo, -crf 23 y veryslow pueden generar archivos muy compactos con bastante buena calidad.