I'm versuchen, zwei mp4-Dateien mit ffmpeg verketten. Ich brauche dies ein automatischer Prozess daher, warum ich wählte ffmpeg sein. I'm Konvertieren der beiden Dateien in .ts-Dateien und dann verketten sie und dann versuchen, dass verkettet .ts-Datei zu kodieren. Die Dateien sind h264 und aac kodiert und ich hoffe, dass die Qualität die gleiche oder so nah an Original wie möglich zu halten.
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
Leider bekomme ich während der Kodierung die folgende Fehlermeldung von ffmpeg zurück:
[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
Dies geschieht etwa auf halbem Weg durch die Kodierung, die mich denken lässt, dass man nicht konkate zwei .ts-Dateien zusammen und haben es funktioniert.
FFmpeg verfügt über drei Verkettungsmethoden:
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
Beachten Sie, dass diese Methode eine Neukodierung durchführt.
$ 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
Für 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
Diese Methode funktioniert nicht für viele Formate, einschließlich MP4, aufgrund der Natur dieser Formate und der vereinfachten Verkettung, die mit dieser Methode durchgeführt wird.
concat demuxer: Verwenden Sie ihn, wenn Sie eine Neukodierung vermeiden wollen und Ihr Format keine Verkettung auf Dateiebene unterstützt (die meisten Dateien, die von allgemeinen Benutzern verwendet werden, unterstützen keine Verkettung auf Dateiebene).
Im Zweifelsfall probieren Sie den Concat-Demuxer.
Am Ende habe ich mpg als Zwischenformat verwendet und es hat funktioniert (HINWEIS: dies ist ein gefährliches Beispiel, -qscale 0 wird das Video neu kodieren...)
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
Hier ist ein Skript, das ich gemacht, um mehrere GoPro mp4' s in eine 720p mp4 verketten. Hoffe es ist hilfreich.
#!/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}