ffmpeg fusiona 60 fps y 30 fps mp4 en un solo archivo

He estado tratando de fusionar algunos archivos mp4 con diferentes velocidades de cuadro sin éxito. Cuando combino los archivos, siempre parece haber un problema con la salida. La mayoría de las veces el audio no está sincronizado con el video. Intenté modificar la velocidad de fotogramas de los videos (30 a 60 o 60 a 30), pero reduce demasiado la calidad.

Para fusionar los archivos, he estado usando todas las soluciones en esta publicación .

al probar este método:

:: Create File List
   echo file file1.mp4 >  mylist.txt 
   echo file file2.mp4 >> mylist.txt
   echo file file3.mp4 >> mylist.txt
:: Concatenate Files
   ffmpeg -f concat -i mylist.txt -c copy output.mp4

El audio y el video ya no están sincronizados y el video a veces se congela.

Al probar "mp4 a mpg y luego fusionar":

 ffmpeg -i 1.mp4 -qscale 0 1.mpg
 ffmpeg -i 2.mp4 -qscale 0 2.mpg
 cat 1.mpg 2.mpg | ffmpeg -f mpeg -i - -qscale 0 -vcodec mpeg4 output.mp4

Pierdo el audio en los archivos de 60 FPS, en este punto pensé que era un problema de audio, así que traté de "unificar" el códec de audio de todos los archivos mp4 de esta manera:

ffmpeg -i input.mp4 -acodec SOME_AUDIO_TYPE -vcodec copy out.mp4

la combinación se produce sin ningún error, pero el audio aún no está sincronizado

Entonces, en mi último intento, intenté cambiar la tasa de fps de mis archivos de esta manera:

ffmpeg -y -i source.mp4 -r FPS -s RESOLUTION -c:v libx264 -b:v 3M -strict -2 -movflags faststart destination.mp4

Pero el resultado reduce demasiado la calidad.

Existe el ffprobe de los dos archivos:

libavutil      55. 57.100 / 55. 57.100
libavcodec     57. 88.100 / 57. 88.100
libavformat    57. 70.100 / 57. 70.100
libavdevice    57.  5.100 / 57.  5.100
libavfilter     6. 81.100 /  6. 81.100
libswscale      4.  5.100 /  4.  5.100
libswresample   2.  6.100 /  2.  6.100
libpostproc    54.  4.100 / 54.  4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
Metadata:
  major_brand     : isom
  minor_version   : 512
  compatible_brands: isomiso2avc1mp41
  encoder         : Lavf57.63.100
Duration: 00:00:32.00, start: 0.000000, bitrate: 3120 kb/s
  Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720, 2981 kb/s, 30 fps, 30 tbr, 90k tbn, 60 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



libavutil      55. 57.100 / 55. 57.100
libavcodec     57. 88.100 / 57. 88.100
libavformat    57. 70.100 / 57. 70.100
libavdevice    57.  5.100 / 57.  5.100
libavfilter     6. 81.100 /  6. 81.100
libswscale      4.  5.100 /  4.  5.100
libswresample   2.  6.100 /  2.  6.100
libpostproc    54.  4.100 / 54.  4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
Metadata:
  major_brand     : isom
  minor_version   : 512
  compatible_brands: isomiso2avc1mp41
 encoder         : Lavf57.63.100
Duration: 00:00:23.01, start: 0.000000, bitrate: 2585 kb/s
  Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720, 2412 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc (default)
  Metadata:
    handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 159 kb/s (default)
  Metadata:
    handler_name    : SoundHandler

Al fusionar los 2 archivos con el primer método, esto es lo que obtengo:

[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872466, current: 843279; changing to 2872467. This may result in incorrect timestamps in the output file.
[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872467, current: 843535; changing to 2872468. This may result in incorrect timestamps in the output file.
[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872468, current: 843791; changing to 2872469. This may result in incorrect timestamps in the output file.
[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872469, current: 844047; changing to 2872470. This may result in incorrect timestamps in the output file.
frame= 2340 fps=0.0 q=-1.0 Lsize=   19428kB time=00:00:50.53 bitrate=3149.8kbits/s speed=58.7x    
video:18420kB audio:949kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.304418%

¿Hay alguna solución a este problema?

¿Cómo estás fusionando los archivos? ¿Cómo estás convirtiendo las tasas de fotogramas? Incluya la línea de comando ffmpeg completa y la salida de la consola (si eso es lo que está usando).
En primer lugar, gracias por intentar ayudarme a resolver este problema. Edité mi pregunta como me aconsejaste e incluí la mayoría de los pasos que probé. Espero que esto te ayude a descubrir los posibles errores que estoy cometiendo.
Muestra la salida completa de la consola de:ffmpeg -i file1.mp4 -i file2.mp3 -i file3.mp4

Respuestas (2)

El audio tendrá que volver a codificarse con la misma frecuencia de muestreo, si es diferente en los archivos. No es necesario volver a codificar el video, pero debe tener la misma escala de tiempo.

ffmpeg -i input.mp4 -c:a aac -ar 48000 -ac 2 -c:v copy -video_track_timescale 600 out.mp4

Si el audio de un archivo ya es AAC-LC estéreo de 48 kHz, puede omitir la codificación de audio y simplemente usar-c:a copy

Ejecute el concat con los archivos procesados.

Al aplicar esos cambios a un archivo (44kHz) los primeros segundos se corrompen. Todavía intenté fusionar los archivos y VLC se bloquea cuando comienza el video dañado. está el ffprobe del archivo antes y después del comando: pastebin.com/TPYt7NVf . El comienzo es negativo, realmente no sé lo que significa, pero podría ser una pista.
Su ffprobe aquí muestra Mainel perfil para videos. La sonda pastebin muestra Alto. ¿Recodificaste los videos?
Lo siento, tengo muchos mp4 que necesito combinar, podría haber usado otros diferentes porque supuse que las únicas "variables" que importaban eran el audio y la velocidad de fotogramas. ¿Qué hay en el "principal" o "alto" que causa un problema? porque podría tener este mientras fusiono otros videos.
Pueden tener diferente número de marcos de referencia.
¿Explica esto realmente por qué el video se corrompe al cambiar el códec de audio y la escala de tiempo?
El video no se corrompe al cambiar la escala de tiempo o el códec de audio. Si los flujos de video que se agregan no tienen los mismos parámetros de flujo de bits, generalmente el reproductor producirá una salida corrupta. La escala de tiempo solo se encarga de preservar la velocidad de las imágenes.
Así lucen los primeros segundos del video "out.mp4" gyazo.com/f596143d2a638242d3285dbb09ad8d72
Creo que hay un problema con mis archivos cuando hago algo como esto ffmpeg -i 1.mp4 -c:v copy output.mp4(solo para verificar el archivo) la salida está dañada (la misma salida que el gyazo). ¿Supongo que es un error en los archivos? Solo los descargo de twitch.tv, que creo que es una fuente confiable

En la carpeta actual, convierta todos los archivos mp4 a TS. Luego use el comando 'copiar' de Windows para fusionar cada TS. Luego, una vez que tenga un solo ts, transmux a mp4 sin volver a codificar.

for %i in (*.mp4) do ffmpeg -i "%i" -c copy -bsf:v h264_mp4toannexb "%~ni.ts" 
copy /b *.ts all.ts
ffmpeg -i all.ts -c copy all.mp4