La concatenación de ffmpeg produce un resultado demasiado largo sin sonido y con una velocidad parcialmente incorrecta

La concatenación de ffmpeg produce un resultado demasiado largo sin sonido y con una velocidad parcialmente incorrecta

Estoy usando ffmpeg 4.2.4.

Tengo dos fragmentos cortos de video, ambos grabados con mi teléfono. Corté una sección de la primera (comenzando a los 18 segundos y también de 18 segundos de duración; el resultado parece tener una duración de 18,02 segundos):

ffmpeg -i VID_20201205_135951.mp4 -ss 00:18 -t 00:18 1.mp4

Y estoy usando todo el segundo, que dura 13,55 segundos:

cp VID_20201205_140804.mp4 2.mp4

Escribí un archivo concat.txt:

file '1.mp4'
file '2.mp4'

Y usé el filtro concat para unirlos:

ffmpeg -f concat -i concat.txt -c copy 12.mp4

¡El vídeo resultante no tiene sonido y dura 3 minutos y 2,35 segundos! Si lo miro, los primeros 18 segundos son correctos (aunque sin sonido), luego se congela, mostrando el último fotograma de la primera parte, hasta el 1:47, momento en el que comienza a reproducirse la segunda parte, pero muy lentamente, hasta el final del vídeo.

¿Alguna idea de lo que estoy haciendo mal? ¿O cómo podría depurar esto?

Aquí está la información que imprime ffmpeg para la primera entrada:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:18.02, start: 0.000000, bitrate: 17735 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 3840x2160 [SAR 1:1 DAR 16:9], 17678 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 69 kb/s (default)
    Metadata:
      handler_name    : SoundHandle

La segunda entrada:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2020-12-05T14:08:20.000000Z
    com.android.version: 11
  Duration: 00:00:13.55, start: 0.000000, bitrate: 40373 kb/s
    Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuvj420p(pc, smpte170m), 3840x2160, 42298 kb/s, SAR 1:1 DAR 16:9, 30.02 fps, 30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      rotate          : 180
      creation_time   : 2020-12-05T14:08:20.000000Z
      handler_name    : VideoHandle
    Side data:
      displaymatrix: rotation of -180.00 degrees
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 96 kb/s (default)
    Metadata:
      creation_time   : 2020-12-05T14:08:20.000000Z
      handler_name    : SoundHandle

Y la salida:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '12.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:03:02.35, start: 0.000000, bitrate: 4734 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 3840x2160 [SAR 1:1 DAR 16:9], 4719 kb/s, 5.07 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 80 kb/s (default)
    Metadata:
      handler_name    : SoundHandle

Respuesta1

Todas las entradas deben tener los mismos atributos. Los suyos tienen diferentes perfiles H.264 (línea de base versus alta) y velocidades de cuadros.

Haz que un vídeo coincida con el otro:

ffmpeg -i 2.mp4 -c:v libx264 -r 30 -c:a copy 2b.mp4

El perfil alto se seleccionará de forma predeterminada, por lo que no es necesario agregarlo manualmente, pero si desea utilizar Baseline, utilice -profile:v baseline.

O convierta todos los videos en un conjunto de atributos de comentarios independientemente de los atributos de entrada. Ver¿Cómo concatenar vídeos en ffmpeg con diferentes atributos?

información relacionada