Estoy tratando de concatenar dos archivos mp4 usando ffmpeg. Necesito que este sea un proceso automático, por eso elegí ffmpeg. Estoy convirtiendo los dos archivos en archivos .ts y luego los concateno y luego intento codificar ese archivo conts. Los archivos están codificados en h264 y aac y espero mantener la calidad igual o lo más cercana posible al original.
ffmpeg -i part1.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part1.ts
ffmpeg -i part2.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part2.ts
cat part1.ts part2.ts > parts.ts
ffmpeg -y -i parts.ts -acodec copy -ar 44100 -ab 96k -coder ac -vbsf h264_mp4toannexb parts.mp4
Desafortunadamente, recibo el siguiente mensaje de error de ffmpeg durante la codificación:
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[NULL @ 0x101d600]error, non monotone timestamps 13779431 >= 13779431kbits/s
av_interleaved_write_frame(): Error while opening file
Esto sucede aproximadamente a la mitad de la codificación, lo que me hace pensar que no puedes concatenar dos archivos .ts juntos y hacer que funcione.
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 puede probarlo con mp4). El-safe 0
es para las versiones recientes de FFmpeg se quejan de nombre de archivo inseguro , y el-type f
es solo para la lista de archivos. Agregué| sort
para ordenar los archivos alfabéticamente; porque losfind
lee en orden como guardados en el sistema de archivos. Funciona también para archivos con espacios en blanco.ffmpeg -i "concat:input1|input2" -codec copy output
. No hay necesidad de escapar del carácter de la tubería.PARA ARCHIVOS MP4
Para los archivos .mp4 (que obtuve de DailyMotion.com: un episodio de televisión de 50 minutos, descargable solo en tres partes, como tres archivos de video .mp4), la siguiente fue una solución efectiva para Windows 7 , y NO implica volver a codificar el archivos.
Cambié el nombre de los archivos (como file1.mp4 , file2.mp4 , file3.mp4 ) de modo que las partes estaban en el orden correcto para ver el episodio de televisión completo.
Luego creé un archivo por lotes simple (concat.bat), con los siguientes contenidos:
El archivo por lotes , y ffmpeg.exe , deben colocarse en la misma carpeta que los archivos .mp4 para unirse. Luego ejecute el archivo por lotes. Por lo general, demorará menos de diez segundos en ejecutarse.
.
Anexo (21/10/2018) -
Si lo que estaba buscando es un método para especificar todos los archivos mp4 en la carpeta actual sin tener que volver a escribirlos, intente esto en su archivo por lotes de Windows ( DEBE incluir la opción -safe 0 ):
Esto funciona en Windows 7, en un archivo por lotes. ¡No intentes usarlo en la línea de comando, porque solo funciona en un archivo por lotes!
fuente
C:\blah>type mylist.txt<ENTER>
(para que vean el contenido de ese archivo) Entoncesffmpeg -f concat -i mylist.txt -c copy output.mp4<ENTER>
también debe incluir una referencia trac.ffmpeg.org/wiki/Concatenate (esa referencia incluso usa el mismo nombre de archivo, mylist.txt)-i
parámetro. En Linux hice esto:ls -1 P1041*.mp4 | sed s/"P"/" file P"/g > mylist.txt
que es aún más genial que codificar un script por lotes. De todos modos, se-c copy
realiza muy rápidamente (que no sabía) y esta es la verdadera magia de esta respuesta.Aquí hay una manera rápida (toma menos de 1 minuto) y sin pérdidas para hacerlo sin necesidad de archivos intermedios:
El "ls" contiene los archivos a unir El "perl" crea el archivo de concatenación sobre la marcha en una tubería La parte "-i -" le dice a ffmpeg que lea desde la tubería
(nota: mis archivos no tenían espacios o cosas extrañas, necesitará un escape de shell apropiado si desea hacer esta idea con archivos "duros").
fuente
ls Movie_Part_1.mp4 Movie_Part_2.mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
ls * | perl -ne 'print "file $_"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
si sus archivos están bien nombrados y en orden. Me funcionó muy bien en OS X, exactamente lo que quería.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 0
es para las versiones recientes de FFmpeg se quejan de nombre de archivo inseguro , y el-type f
es solo para la lista de archivos. Agregué| sort
para ordenar los archivos alfabéticamente; porque losfind
lee en orden como guardados en el sistema de archivos. Funciona también para archivos con espacios en blanco.ffmpeg
que funcione:-protocol_whitelist file,tcp,http,pipe
para archivos MP4:
Si no son exactamente los mismos archivos MP4 (100% del mismo códec, misma resolución, mismo tipo), primero debe transcodificarlos en secuencias intermedias:
¡NOTA! : La salida será como el primer archivo (y no el segundo)
fuente
Estaba tratando de concatenar tres
.mp3
archivos de audio en un solo.m4a
archivo y este comando ffmpeg funciona.Comando de entrada:
Significados de: -filter_complex "concat = n = 3: v = 0: a = 1" :
Para obtener más información: utilice
ffmpeg -h full
las opciones de imprimir todas (incluidas todas las opciones específicas de formato y códec, muy largas)fuente
-f concat -safe 0 -i "file.txt" -c copy -y "OutPut.mp4"
, concatá, pero cuando algunos videos tienen audio y otros no tienen audio, no funciona, ¿cómo puedo solucionar esto? Gracias -Terminé usando mpg como formato intermedio y funcionó (NOTA: este es un ejemplo peligroso, -qscale 0 volverá a codificar el video ...)
fuente
-sameq
fue eliminado. Usar en su-qscale 0
lugar.-sameq
no significa "misma calidad" y se ha eliminado de ffmpeg como lo menciona @XavierHo.concat
comando en ffmpeg, como lo hace @rogerdpack arriba.La documentación detallada sobre varias formas de concatenación en ffmpeg puede ser aquí .
Puedes usar 'filtro Concat' para una concatenación rápida.
Realiza una nueva codificación. Esta opción es mejor cuando las entradas tienen diferentes formatos de video / audio.
Para concatenar 2 archivos:
Para concatenar 3 archivos:
Esto funciona para los mismos tipos de archivos de entrada y múltiples.
fuente
ouput.mp4
tasa de bits de video es significativamente menor que la tasa de bits de video de los videos de entradaEncontré que el operador de tubería no funcionaba para mí cuando usaba la opción 3 para concatenar varios MP4 en una Mac en la respuesta aceptada.
El siguiente one-liner funciona en una Mac (High Sierra) para concatenar mp4s, sin necesidad de crear archivos intermedios.
ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
fuente
Aquí 2 soluciones de bash puro usando solo
ffmpeg
y no usandoSolución de una línea usando
ls
Función que toma 0 o 2+ argumentos
Nota: había probado algunas soluciones en este hilo y ninguna me satisfizo
fuente
basado en las respuestas de rogerdpack y Ed999, he creado mi versión .sh
une todos los
*.mp4
archivos en la carpeta actual enjoined-out.mp4
probado en mac.
el tamaño de archivo resultante es la suma exacta de mis 60 archivos probados. No debería haber ninguna pérdida. Justo lo que necesitaba
fuente
esto funcionó para mí (en windows)
un ejemplo...
Pitón
Usando algún código de Python para hacerlo con la cantidad de mp4 que hay en una carpeta (instale python desde python.org, copie y pegue y guarde este código en un archivo llamado mp4.py y ejecútelo desde el cmd abierto en la carpeta con python mp4.py y todos los mp4 en la carpeta se concatenarán)
Versión 2 con Python
Tomado de mi publicación en mi blog , así es como lo hago en python:
fuente
Para
.mp4
archivos, he encontrado que funciona mejor y más rápido de usar la herramienta de línea de comandos de código abierto:mp4box
. Entonces puedes usarlo de esta manera:Descárguelo aquí para la mayoría de las plataformas: https://gpac.wp.imt.fr/mp4box/
fuente
Aquí hay un script que hice para concatenar varios GoPro mp4 en un mp4 de 720p. Espero que sea de ayuda.
fuente
De la documentación aquí: https://trac.ffmpeg.org/wiki/Concatenate
Este enfoque funciona en todas las plataformas.
Necesitaba la capacidad de encapsular esto en un script multiplataforma, así que utilicé
fluent-ffmpeg
la siguiente solución:fuente
fuente
Fusionar todos los archivos mp4 del directorio actual
Personalmente, me gusta no crear un archivo externo que tengo que eliminar después, por lo que mi solución fue la siguiente, que incluye la lista de numeración de archivos (como
file_1_name, file_2_name, file_10_name, file_20_name, file_100_name
, ...)fuente
Después de varios intentos, el siguiente script funcionó para mí en Windows 10 PowerShell.
Aquí las dos primeras líneas crean un archivo de texto temp.txt que tiene el siguiente contenido
3ra, 4ta línea verifica si ffmpeg está disponible en la ruta y crea el "join.mp4"
Las diferencias clave de otras respuestas son las siguientes
para mi archivo mp4 anterior funcionó, es posible que deba usar otras alternativas como las siguientes, dependiendo de su codificación de video.
Todos estos posibles filtros de Bitstream se pueden encontrar en https://ffmpeg.org/ffmpeg-bitstream-filters.html
fuente
Este es mi método para unirme a un directorio lleno de archivos MP4 usando la sustitución de comandos y el filtro de video concat (esto se volverá a codificar). se unieron a 17 archivos de una sola vez):
Nota: este comando une sus archivos en el orden en que se nombran (es decir, el mismo orden en que se presentan si ejecuta
ls *.mp4
); en mi caso, cada uno tenía un número de pista, por lo que funcionó muy bien.fuente
El protocolo concat descrito aquí; https://trac.ffmpeg.org/wiki/Concatenate#protocol
Cuando se implementa utilizando canalizaciones con nombre para evitar archivos intermedios
Es muy rápido (léase: instantáneo), no tiene marcos caídos y funciona bien.
Recuerde eliminar los archivos de tubería con nombre y recuerde verificar si el video es H264 y AAC, lo que puede hacer con solo
ffmpeg -i filename.mp4
(verifique las menciones h264 y aac)fuente
La respuesta aceptada en forma de script reutilizable de PowerShell
fuente