FFmpeg 拼接 合并 多个文件

来自艺搜天下
跳到导航 跳到搜索

相同编码器

2种方法:concat demuxer(更灵活,需要相同的编解码器,相同的time base,但可以使用不同的容器格式)和concat protocal

Concat demuxer

ffmpeg -f concat -safe 0 -i mylist.txt -c copy output

生成列表:

for f in ./*.wav; do echo "file '$f'" >> mylist.txt; done # printf "file '%s'\n" ./*.wav > mylist.txt

或者

ffmpeg -f concat -safe 0 -i <(for f in ./*.wav; do echo "file '$PWD/$f'"; done) -c copy output.wav
ffmpeg -f concat -safe 0 -i <(printf "file '$PWD/%s'\n" ./*.wav) -c copy output.wav

Concat protocol

While the demuxer works at the stream level, the concat protocol works at the file level.

ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy output.ts

如果是mp4,需要先转码成MPEG-2 transport streams

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

使用命名管道来避免中间文件:

mkfifo temp1 temp2
ffmpeg -y -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1 2> / dev / null&\
ffmpeg -y -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2 2> / dev / null&\
ffmpeg -f mpegts -i“concat:temp1 | temp2”-c copy -bsf:aac_adtstoasc output.mp4

不同编码器

Concat filter:不能使用-c copy,输入必须有相同的分辨率和帧率,可能需要在concat之前先用scale或scale2ref

ffmpeg -i input1.mp4 -i input2.webm -i input3.mov \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mkv