Escalar vídeo con FFMpeg. Avanzado.

Hay formas sencillas para escalar un vídeo con FFMpeg:

ffmpeg -i input.mov -filter:vscale=1080:-1 output.mp4

Con -1 indicamos que conserve el aspecto (proporción) del original.

El problema viene cuando quiero escalar un vídeo dentro de una operación compleja de ffmpeg. Al usar, por ejemplo -filter_complex, no permite usar el cambio de escala de la manera normal.

Quería compartir este código que me ha costado bastante sacar a base de muchas pruebas y consultas en la web.

La idea era poder hacer un script para poder crear un vídeo con frames negros al comienzo y al final (esto es tema de una entrada anterior) y poderlo escalar al tamaño deseado. En este caso de 1920×1080 a 1280x 720

Para ello primero hay que indicar el tamaño que queremos en el generador de frames negros…

-f lavfi -i color=c=black:s=1280×720:r=25:d=1

… y luego escalar el vídeo que interesa dentro de -filter_complex

-filter_complex «[0:v] trim=start_frame=1:end_frame=5 [blackstart]; [0:v] trim=start_frame=1:end_frame=5 [blackend]; [2:v] scale=1280:-1 [scaled]; [1:a] atrim=duration=0.2 [audiostart]; [1:a] atrim=duration=0.2 [audioend];

Aquí el código completo:

ffmpeg -f lavfi -i color=c=black:s=1280×720:r=25:d=1 -f lavfi -i «aevalsrc=0:c=stereo:d=1» -i input.mov -filter_complex «[0:v] trim=start_frame=1:end_frame=5 [blackstart]; [0:v] trim=start_frame=1:end_frame=5 [blackend]; [2:v] scale=1280:-1 [scaled]; [1:a] atrim=duration=0.2 [audiostart]; [1:a] atrim=duration=0.2 [audioend]; [blackstart] [audiostart] [scaled] [2:a] [blackend] [audioend] concat=n=3:v=1:a=1[v][a]» -map «[v]» -map «[a]» -c:v libx264 -crf 22 -preset slow -profile:v high10 -pix_fmt yuv420p -c:a aac -strict -2 -b:a 128k -timecode 00:01:00:00 -tune zerolatency output.mp4

 

 

Sincros A/V con FFMpeg

ffmpeg

He realizado unas pruebas de compresión con FFMpeg en Mac. La idea era crear un script parecido a otro que realicé anteriormente para insertar frames de negro al comienzo y final del vídeo y comprimirlo para poder ser enviado por mail.

Al hacer estas pruebas me he dado cuenta que el resultado tenía un desfase entre audio y vídeo.

Describo las conclusiones de las pruebas por si son de utilidad para alguien y como recordatorio para mí.

Normalmente la entrada de vídeo que uso suele ser un master en alta, bien usando QT Animation o bien ProRes 444.

Quería probar qué codec es el idóneo para comprimir a mejor calidad y con menos «peso»

El problema que me encontré es que el resultado desfasaba dos frames el audio del vídeo.

Esto ocurría codificando con libx264 y aac

Para la prueba he creado un vídeo con un sólido de color que tenía un frame de barras y tono en varios puntos para poder ver los sincros a/v

Confirmé que había 2 frames de desfase con la librería libx264.

Resultado de pruebas con distintos codecs de audio y vídeo:

  • Con -c:v libx264 y -c:a aac — hay 2 frames de desfase. — .mp4
  • Con -c:v v408 (prores444) y -c:a aac — hay 1fr de desfase.  — .mov
  • Con -c:v v408 y -c:a pcm_s24le — audio y vídeo ok.  — .mov
  • Con -c:v qtrle y -c:a pcm_s24le — audio y vídeo ok.  — .mov
  • Con -c:v mpeg1video y -c:a mp2 — audio y vídeo ok. (Codecs por defecto de ffmpeg)  — .mpg
  • Con -c:v mpeg1video y -c:a aac –Fallo. No abre en QT  — .mpg
  • Con -c:v libxvid (mpeg4) y -c:a aac — audio y vídeo ok. — .mp4
  • Con -c:v libxvid (mpeg4) y -c:a pcm_s24le — audio y vídeo ok. — .mov

Por otro lado he comprobado que el h264 usado con libx264 es un codec MUY superior a mpeg1video o  libxvid (mpeg4). Comprimiendo el mismo vídeo y a igual tamaño, el h264 da mucha más calidad que el mpeg4 y mpeg1… con diferencia.

Por tanto interesaba arreglar la falta de sincros entre audio y vídeo porque interesa más usar libx264.

Si añadimos -tune zerolatency despues de los settings de compresión con libx264, conseguimos que vayas a sincro el audio y vídeo.

Aquí os muestro los comandos usados con ffmpeg desde el terminal para crear 5 frames de negro delante y detrás del vídeo y comprimirlo en h264 en una relación aproximada de 12:1 Mb

Al utilizar el codec aac he tenido que añadir el comando» -strict -2″ para poderlo usar.

ffmpeg -f lavfi -i color=c=black:s=1920×1080:r=25:d=1 -f lavfi -i «aevalsrc=0:c=stereo:d=1» -i test_sincro.mov -filter_complex «[0:v] trim=start_frame=1:end_frame=5 [blackstart]; [0:v] trim=start_frame=1:end_frame=5 [blackend]; [1:a] atrim=duration=0.2 [audiostart]; [1:a] atrim=duration=0.2 [audioend]; [blackstart] [audiostart] [2:v] [2:a] [blackend] [audioend] concat=n=3:v=1:a=1[v][a]» -map «[v]» -map «[a]» -c:v libx264 -crf 40 -preset slow -profile:v high10 -pix_fmt yuv420p -c:a aac -strict -2 -b:a 128k -timecode 00:01:00:00 -tune zerolatency mail_low.mp4

No conozco la razón de la falta de sincros entre audio y vídeo del codec libx264 en Mac. Cualquier explicación o aporte será bien recibido.

 

Prores 444 XQ en Adobe

Apple estrena códec, el Prores 4444 XQ. Aquí tenéis la info sobre el XQ, un códec que mejora bastante al ya conocido 4444. Por lo visto, Alexa ya trabaja con él y exporta-graba en este códec.

Un códec perfecto para color, vfx y masterizado.

Todo es demasiado bonito…

En efecto, cuando lo he querido probar no he podido. Apple, en su afán por ocultarnos todo solo permite, por ahora, que FCPX y/o Compressor puedan manejar este códec. Permanece oculto al resto de las aplicaciones no Apple.

En este vídeo podemos ver cómo conseguir hacer funcionar el códec con Adobe (Encoder, AE, Premiere…) Ojo que el tío se enrolla como las persianas, de los 20 min solo valen 2.

La idea es bien sencilla: Para que otras aplicaciones puedan usar este códec solo tenemos que llevar su componente a Quick Time. Lo copiamos de FCPX y lo pegamos en QT. Entonces cualquier aplicación puede ver y utilizar este prores 4444 XQ.

Lo he chequeado con Encoder y AE y va como la seda. También lo he probado con MPEG Streamclip y ok.

Apple FCP and Compressor vs. Adobe CC

Interesante artículo.

Flujos de trabajo entre FCPX – Compressor y Premiere – Encoder.

Parece que los de Adobe son más rápidos… con diferencia. Hablamos de flujos de trabajo entre los dos, no tiempos de render de FCPX y Premiere. Recuerdo que publiqué un post con info sobre la rapidez de FCPX haciendo render… más que Premiere. Esto habrá que contrastarlo.

Creo que Compressor es el culpable de la lentitud de esta comparativa.

Aquí tenemos una comparativa de codificación a H264 entre FCPX y Premiere CC. Adobe de nuevo gana por goleada. Tres veces más rápido.