Jeg prøver å sammenkoble to mp4-filer ved hjelp av ffmpeg. Jeg trenger dette for å være en automatisk prosess, derfor valgte jeg ffmpeg. Jeg konverterer de to filene til .ts-filer og deretter sammenkobler dem og prøver deretter å kode den sammenkoblede .ts-filen. Filene er h264 og aac-kodet, og jeg håper å holde kvaliteten den samme eller så nær originalen som mulig.
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
Dessverre får jeg følgende feilmelding tilbake fra ffmpeg under koding:
[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
Dette skjer omtrent halvveis gjennom kodingen, noe som får meg til å tro at du ikke kan koble to .ts-filer sammen og få det til å fungere.
FFmpeg har tre konkateneringsmetoder:
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
Merk at denne metoden utfører en omkoding.
$ 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
For 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
Denne metoden fungerer ikke for mange formater, inkludert MP4, på grunn av arten av disse formatene og den forenklede sammenkoblingen som utføres av denne metoden.
concat filter: Bruk hvis inngangene dine ikke har de samme parametrene (bredde, høyde osv.), eller ikke er de samme formatene/kodekene, eller hvis du vil utføre filtrering. (Du kan omkode bare inngangene som ikke samsvarer, slik at de deler samme kodek og andre parametere, og deretter bruke concat demuxer for å unngå å omkode de andre inngangene).
concat demuxer: Bruk når du vil unngå omkoding og formatet ditt ikke støtter konkatenering på filnivå. ikke støtter konkatenering på filnivå (de fleste filer som brukes av vanlige brukere støtter ikke konkatenering på filnivå).
concat-protokoll: Brukes med formater som støtter sammenkjeding på filnivå. (MPEG-1, MPEG-2 PS, DV). Ikke bruk med MP4.
Hvis du er i tvil, prøv concat demuxer.
FFmpeg FAQ: Hvordan kan jeg sammenføye videofiler * FFmpeg Wiki: Hvordan sammenføye (flette) mediefiler
Jeg endte opp med å bruke mpg som mellomformat, og det fungerte (MERK dette er et farlig eksempel, -qscale 0 vil kode videoen på nytt ...)
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
Her er et skript jeg laget for å sammenkoble flere GoPro mp4-er til en 720p mp4. Håper det er til hjelp.
#!/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}