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.