La transcodificación ffmpeg de video largo hace que el audio no esté sincronizado

Grabé un video de 50 minutos, lo edité en Hitfilm Express para censurar/difuminar a las personas y lo exporté en el formato de alta resolución de Hitfilm, generando un archivo de 80 GB. Cuando trato de transcodificar este archivo en algo más manejable, ffmpeg hace que el audio se desvíe. Al principio todo suena bien, pero poco a poco el audio va más rápido que el video. El archivo de entrada según lo informado por ffmpeg es:

Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Volumes/BakaTres/witness.mov':
  Metadata:
    major_brand     : qt  
    minor_version   : 537199360
    compatible_brands: qt  
  Duration: 00:50:31.42, start: 0.000000, bitrate: 230875 kb/s
    Stream #0:0(eng): Video: cfhd (CFHD / 0x44484643), yuv422p10le, 1920x1080, 229401 kb/s, 59.96 fps, 59.96 tbr, 90k tbn, 90k tbc (default)
    Metadata:
      encoder         : CineForm HD
    Stream #0:1(eng): Audio: pcm_s16le (lpcm / 0x6D63706C), 48000 Hz, stereo, s16, 1536 kb/s (default)

Después de ejecutar el siguiente comando de transcodificación ffmpeg -i witness.mov -filter:v scale=640:-1 mini.mkvque vuelve a codificar todo, estas son las estadísticas del archivo de salida:

Input #0, matroska,webm, from 'mini.mkv':
  Metadata:
    COMPATIBLE_BRANDS: qt  
    MAJOR_BRAND     : qt  
    MINOR_VERSION   : 537199360
    ENCODER         : Lavf57.56.100
  Duration: 00:50:30.42, start: 0.000000, bitrate: 785 kb/s
    Stream #0:0(eng): Video: h264 (High 4:2:2), yuv422p(progressive), 640x360, 59.96 fps, 59.96 tbr, 1k tbn, 119.92 tbc (default)
    Metadata:
      ENCODER         : Lavc57.64.101 libx264
      DURATION        : 00:50:30.422000000
    Stream #0:1(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default)
    Metadata:
      ENCODER         : Lavc57.64.101 libvorbis
      DURATION        : 00:50:28.403000000

La primera señal de que algo va mal es que el archivo original especifica una duración de 50:31,42, mientras que la transcodificación genera un archivo de 50:30,42. No me importaría menos el segundo si no fuera porque el audio producido es 50:28.4, dos segundos menos que el video, lo que explica la diferencia de retardo. Lamentablemente, ffmpeg no muestra la longitud de entrada, pero si copio el audio de origen en un archivo aiff, Audacity me dice que, de hecho, tiene una duración de 50: 28,4, entonces, ¿Hitfilm está exportando el audio incorrectamente con una duración más corta que el video?

He visto la siguiente respuesta para un problema similar, pero no entiendo cómo se calculan los valores o cómo aplicar estos valores a mis archivos de entrada. ¿Qué valores debo buscar en la información de entrada/salida para comparar?

Incluso si la longitud transcodificada final es ligeramente diferente, ¿cómo puedo evitar que el audio se desincronice (o corregir la diferencia exportada de Hitfilm en video y audio)?

Añadir -af aresample=async=1y comprobar.
@Gyan no hay diferencia en comparación con no usar ese interruptor.

Respuestas (1)

Después de probar algunas cosas al azar, logré sincronizar el audio/video cambiando la velocidad del audio:

ffmpeg  -i witness.mov -af asetrate=48018 resampled.mkv

resampled.mkvTiene una sincronización correcta, pero desafortunadamente el audio es más corto que el video restante durante unos segundos. Lo que significa que el problema es realmente que la velocidad de fotogramas es un poco más lenta de lo que debería en el archivo de entrada. Según mis cálculos, el problema es que la velocidad de fotogramas está configurada en 59,96, y establecerla exactamente en 60,0 haría que el video coincidiera con el audio. Intenté usar:

ffmpeg  -i witness.mov -framerate 60 resampled.mkv

Pero la velocidad de fotogramas del video no cambió.

Tengo webm -> mp4 1h de duración, ambos métodos no funcionan.