使用trim
和concat
–源文件使用不同的编解码器
为此,请确保您的单个文件具有相同的分辨率,理想情况下应具有相同的帧率和色度二次采样等。这将防止在连接期间出现错误或毛刺。
使用trim
和concat
过滤器,您可以一次性完成所有操作而无需拆分文件:
ffmpeg -i edv_g24.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[v0][v1][v2]concat=n=3:v=1:a=0[out]" \
-map "[out]" output.mp4
在这里,trim
用于指定的输入视频流(的各个部分0:v
,1:v
),您以后想连接。这些部件被命名为v0
通过v2
。(setpts
过滤器将这些各个部分的时间戳重置为0,这是串联所必需的)。稍后,我们将这三个部分串联起来。
如果要从某个时间戳记修剪到结尾,请使用trim=start=15
而不是指定范围。
如果文件中有音频,则必须分别修剪这些流:
ffmpeg -i edv_g24_2.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[1:a]atrim=0:5,asetpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=15:30,asetpts=PTS-STARTPTS[a2]; \
[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
请注意,在这种情况下,视频和音频将被重新编码–确保指定适当的输出质量目标(例如,-crf
针对x264,x265或libvpx-vp9)。您可以在FFmpeg Wiki上阅读有关此内容的更多信息,例如VP9或H.264。
使用个别区隔
如果要拆分片段,然后再重新组装它们:
ffmpeg -i edv_g24.mp4 -ss 0 -to 10 -c copy part1.mp4
ffmpeg -i edv_g24.mp4 -ss 10 -to 15 -c copy part2.mp4
ffmpeg -i edv_g24.mp4 -ss 15 -c copy part3.mp4
ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][1:v][2:v]concat=n=3:v=1:a=0[outv]" \
-map "[outv]" -t 30 output.mp4
如果文件有音频,请使用与上述相同的方法:
ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" -t 30 output.mp4
这将再次重新编码视频流。它稍微简单一点,但其他方面应等同于上述方法。
使用解concat
复用器
原则上,您也可以使用concat多路分配器尝试连接比特流,而无需重新编码。创建一个名为的文件concat.txt
并添加以下条目(对应于上面创建的视频剪辑):
file 'part1.mp4'
file 'short-video.mp4'
file 'part3.mp4'
然后串联这些单独的文件:
ffmpeg -f concat -i concat.txt -c copy output.avi
但是,这要求您的剪辑具有相同的编解码器,分辨率,帧速率等–因此,它不适用于所有种类的异构源。
使用concat
协议
上述类型的文件级串联也可以使用该concat
协议来实现,并且具有与上述相同的约束(相同的编解码器,分辨率等):
ffmpeg -i "concat:part1.avi|part2.avi|part3.avi" -c copy output.mp4
有关串联的更多信息,请阅读相应的FFmpeg Wiki页面。