Estoy tratando de concatenar dos archivos mp4 utilizando ffmpeg. Necesito que sea un proceso automático, de ahí que haya elegido ffmpeg. Estoy convirtiendo los dos archivos en archivos .ts y luego concatenándolos y tratando de codificar ese archivo .ts concatenado. Los archivos están codificados en h264 y aac y espero mantener la misma calidad o lo más cerca posible de la 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, estoy recibiendo 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 se puede concatenar dos archivos .ts juntos y que funcione.
FFmpeg tiene tres métodos de concatenación:
lenguaje-todo: sh -->
ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv \
-filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] concat=n=3:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]" output.mkv
Tenga en cuenta que este método realiza una recodificación.
$ cat mylist.txt
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
$ ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4
Para Windows:
(echo file 'first file.mp4' & echo file 'second file.mp4' )>list.txt
ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4
ffmpeg -i "concat:input1|input2" -codec copy output.mkv
Este método no funciona para muchos formatos, incluido el MP4, debido a la naturaleza de estos formatos y a la concatenación simplista que realiza este método.
Demuxer concat: Utilícelo cuando quiera evitar una recodificación y su formato no soporta la concatenación a nivel de archivo (la mayoría de los archivos utilizados por los usuarios generales no soportan la concatenación a nivel de archivo).
Protocolo Concat: Utilizar con formatos que soportan la concatenación a nivel de archivo (MPEG-1, MPEG-2 PS, DV). No utilizar con MP4.
En caso de duda, pruebe el demuxer concat.
Terminé usando mpg como formato intermedio y funcionó (NOTA este es un ejemplo peligroso, -qscale 0 recodificará el video...)
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
Aquí está un script que hice para concatenar varios GoPro mp4's en un mp4 de 720p. Espero que sea de ayuda.
#!/bin/sh
cmd="( "
for i; do
cmd="${cmd}ffmpeg -i $i -ab 256000 -vb 10000000 -mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -f mpeg -; "
done
cmd="${cmd} ) | ffmpeg -i - -vb 10000000 -ab 256000 -s 1280x720 -y out-`date +%F-%H%M.%S`.mp4"
echo "${cmd}"
eval ${cmd}