Concat dos archivos mp4 con ffmpeg sin perder calidad

16

Quiero concatenar 2 videos usando ffmpeg. Estoy usando:

ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts

Pero el archivo mp4 que obtengo se ve mucho peor que el archivo fuente.

Aquí está la información sobre ambos archivos

   Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output1.mp4':
   Metadata:
   major_brand     : isom
   minor_version   : 1
   compatible_brands: isom
   creation_time   : 2013-06-13 15:40:36
   Duration: 00:00:15.72, start: 0.000000, bitrate: 2053 kb/s
   Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 1931 kb/s, 25 fps, 25 tbr,   12800 tbn, 50 tbc
   Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 128 kb/s

  Input #0, mpegts, from 'i0.ts':
  Duration: 00:00:15.64, start: 1.400000, bitrate: 1382 kb/s
  Program 1 
  Metadata:
  service_name    : Service01
  service_provider: Libav
  Stream #0.0[0x100]: Video: mpeg2video (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 104857 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
  Stream #0.1[0x101](und): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s

¿Como puedó resolver esté problema?

Eric Leschinski
fuente
¿Qué estás tratando de hacer exactamente? El término significa "concat" para unir varios archivos, pero sólo se están refiriendo a una entrada, output1.mp4y una salida, i0.ts. La codificación al contenedor de salida ts utilizará el mpeg2videocodificador de forma predeterminada (al menos con su compilación), y la última vez que verifiqué la velocidad de bits predeterminada o la configuración de calidad para este codificador -b:v 200kes demasiado baja para la mayoría de los casos.
llogan
lo siento. Luego los concaté con ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4. Pero el problema es que la calidad ya es mala cuando hago archivos ts
Es posible que no necesite volver a codificar el video MPEG-2. ¿Todas sus entradas originales ( output1.mp4, etc.) tienen los mismos formatos, velocidad de cuadro y tamaño de cuadro?
llogan
sí exactamente. Todos son
1
Ver también stackoverflow.com/questions/7333232/…
rogerdpack

Respuestas:

36

Considere usar el concatdemuxer . De esta forma, puede evitar crear archivos intermedios temporales con pérdida y omitir un paso adicional de codificación.

Nota: Todas las entradas deben tener los mismos tipos de flujo (mismos formatos, misma base de tiempo, etc.).

  1. Cree un archivo de texto e incluya las rutas y los nombres de cada archivo para concatenar (o "unir"). Archivo de ejemplo input.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. Ahora puedes usar el concatdemuxer:

    ffmpeg -f concat -i input.txt -codec copy output.mp4
    

Si no tiene esta función, entonces su ffmpeg es demasiado viejo o está usando un ffmpeg "falso" de la bifurcación libav.

Las compilaciones estáticas fáciles de usar están disponibles para Linux, OS X y Windows a través de la página de descarga de FFmpeg , o puede seguir una guía paso a paso para compilar ffmpeg .

Ver también:

lema
fuente
Esto es exactamente lo que quería y me ayudó a fusionar 2 archivos .mov de mi iPhone 6. Gracias.
Ryan
7

El 1-liner más rápido sería:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4
Hackeron
fuente
¿Alguna oportunidad de obtener una línea de comando de 1 onliner para Windows?
PeterCo
2
En Linux utilicé este oneliner: ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv(mkv acepta más códecs que mp4, pero también puedes probarlo con mp4). El -safe 0es para las versiones recientes de FFmpeg se quejan de nombre de archivo inseguro , y el -type fes solo para la lista de archivos. Agregué | sortpara ordenar los archivos alfabéticamente; porque los findlee en orden como guardados en el sistema de archivos. Funciona también para archivos con espacios en blanco.
erik