ffmpeg concat presenta un problema de sincronización a/v

Tengo un archivo de video de 2 horas y quiero agregar una secuencia de título de 10 segundos al comienzo. El archivo largo tiene una sincronización a/v perfecta de principio a fin. Sin embargo, cuando ffmpeg -f concat -i mylist.txt -c copy outfile.mp4suelo concatenar el archivo de título con el archivo largo, el audio del archivo largo se desincroniza gradualmente y empeora progresivamente hasta que, al final de las 2 horas, el audio está uno o dos segundos por detrás del video. Puedo entender por qué concatpodría romper la sincronización, pero no entiendo por qué haría que la sincronización empeorara progresivamente.

Quiero evitar volver a codificar el archivo largo para mantener la calidad. Si es necesario, puedo volver a codificar el archivo de título porque es solo texto blanco sobre un fondo negro.

Agradecería mucho cualquier sugerencia. Soy un semi-novato del video digital y me he enfrentado a una curva de aprendizaje empinada, pero estoy aprendiendo. Estoy usando Ubuntu Linux 16.04 y ffmpeg 2.8.6-1ubuntu2, que creo que es la última versión de ffmpeg. Tengo alrededor de 20 casetes de video familiares viejos de 2 horas que estoy digitalizando.

Fondo del archivo:

  1. El archivo largo es un archivo MP4 que usa H264 y AAC. Se originó como un archivo .ts y uso ffmpeg para codificarlo en formato mp4. Antes de concatenar el archivo de título, está en perfecta sincronización a/v en todo momento. Es 720x480, con una tasa de bits de audio de 127. Capturé el video de una cinta Sony Handycam Video8 usando un convertidor USB Hauppauge Live-2, usando la CLI de VLC para generar el archivo .ts original. Tiene una duración aproximada de 120 minutos.

  2. El archivo de título lo creé en Blender e intenté duplicar el formato del archivo largo: 720x480, tasa de bits de audio 127, MP4 que contiene H264 y AAC. En realidad, no tiene audio, ya que son solo dos "diapositivas" de texto. (Sé que probablemente haya una pista de audio generada por Blender, pero es solo silencio ya que no agrego ninguna pista de audio a los títulos simples). Solo dura 10 segundos.

Los resultados de ffmpeg -i longfile.mp4es:

Metadata:
major_brand     : isom
minor_version   : 512
compatible_brands: isomiso2avc1mp41
encoder         : Lavf56.36.100
Duration: 01:17:06.58, start: 0.013000, bitrate: 2134 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
720x480 [SAR 32:27 DAR 16:9], 1997 kb/s, 29.97 fps, 29.97 tbr, 29971
tbn, 59.94 tbc (default)
Metadata:
handler_name    : VideoHandler
Stream #0:1(unk): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, 
fltp, 127 kb/s (default)
Metadata:
handler_name    : SoundHandler

los resultados de ffmpeg -i titlefile.mp4es

Metadata:
major_brand     : isom
minor_version   : 512
compatible_brands: isomiso2avc1mp41
encoder         : Lavf56.40.101
Duration: 00:00:10.01, start: 0.012000, bitrate: 421 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
720x480 [SAR 1:1 DAR 3:2], 284 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 
59.94 tbc (default)
Metadata:
handler_name    : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 
stereo, fltp, 127 kb/s (default)
Metadata:
handler_name    : SoundHandler

Respuestas (1)

Correr

ffmpeg -i titlefile.mp4 -vf setdar=16/9 -video_track_timescale 29971 -ac 1 newtitle.mp4

y luego ejecute concat con el nuevo título de video.

Los contenedores modernos como MP4 tienen marcas de tiempo de presentación , que se denominan con referencia a una base de tiempo. Entonces, si el valor de la base de tiempo es 1/500 y el PTS de un cuadro es 200, eso le indica al reproductor de video que muestre ese cuadro en 200*(1/500) = 0,4 segundos. Los valores que se muestran en las lecturas son los recíprocos de esta base de tiempo. Ahora, el demuxer concat, debido a un descuido del diseño (¿o elección?) no vuelve a escalar los valores de PTS para que todas las entradas tengan fotogramas con PTS usando la misma base de tiempo. Sus dos videos tienen diferentes TB, por lo que el video largo después de la concatenación se acelera. La diferencia es perceptiblemente invisible, excepto por la deriva del audio. Esetbntbnel valor es para la transmisión de video. Las transmisiones de audio tienen su propia base de tiempo, relacionada con la frecuencia de muestreo, que es la misma aquí.

¡Eso funciona! ¡Muchas gracias! Además, gracias por los muchos comentarios en hilos similares que ha contribuido. Es muy apreciado.
Bien, esto ayudó mucho con mi problema similar. ¿Podría explicar un poco la base de tiempo del audio? ¿Cómo compruebo que están en la misma base de tiempo? (No puedo ver un valor tbn en la salida). ¿Y lo corrijo de la misma manera?
Las bases de tiempo de audio suelen ser las mismas que la frecuencia de muestreo. Puede ejecutar ffprobe -select_streams a -show_entries stream=time_base -of compact=p=0 video.mp4para obtener el valor. Para el audio, solo recomendaría volver a codificar con una frecuencia de muestreo explícita especificada, es decir -ar 48000.