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.

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s