使用ffmpeg剪辑多个视频并合并

11

我该如何使用ffmpeg将视频剪切成多个部分,然后将它们合并为一个新视频?

3个回答

16
你可以使用concat分离器。

#1 创建一个文本文件

file video.mp4
inpoint 34.5
outpoint 55.1
file video.mp4
inpoint 111.0
outpoint 155.3
file video.mp4
inpoint 278
outpoint 316.4

inpoint/outpoint指令指定了上面列出的文件的修剪开始点和结束点(以秒为单位)。

#2a 创建联合文件

ffmpeg -f concat -i list.txt combined.mp4

#2b 一起叠加图层

ffmpeg -f concat -i list.txt -i background.mp4 -filter_complex "[0:v]scale=400:400[v1];[1:v][v1]overlay=0:0:shortest=1" -shortest -preset superfast "output.mp4"

使用concat的外部音频流

ffmpeg -i 12m.mp4 -f concat -i list.txt -vf setpts=(PTS-STARTPTS)/1.1 -af atempo=1.1 -map 1:v -map 0:a -shortest new.mp4

运行以下命令 *** ffmpeg -f concat -i list.txt combined.mp4 *** 后, 我想要运行以下命令 *** ffmpeg -i combined.mp4 -i background.mp4 -filter_complex "[0:v] scale=400:400 [v1], [1:v][v1]overlay=0:0" -shortest -preset superfast "output.mp4" *** || 让这两行代码在.bat目录中运行。 我应该怎么做才能将这两行代码连接起来? 感谢您的帮助。 - rinofcan
在命令行中,在“-i”之前添加“-safe 0”。 - Gyan
我有一个文件夹里有10个视频,我想在YouTube上循环直播这10个视频(24/7)。你能帮我吗? - rinofcan
我不理解你的回答。#2b 是用来做什么的?我尝试了 #2a 来拼接 .flv 文件的部分,它能够工作...但是视频质量明显降低了。是否有更好的方法?可能需要重新编码吗? - Stefan Reich
@StefanReich请看上面OP在Mar 14 '17 at 5:28的评论。如果你要保存为FLV,请添加-c:v libx264。如果已经选择了该编码器,请添加-crf 18 - Gyan
显示剩余4条评论

7
你的问题比较泛泛,以下示例可能会对你有所帮助,但不一定能解决你具体的问题。
该示例分为三个阶段:
  • Create synthetic video (with no audio):

    ffmpeg -f lavfi -i testsrc=duration=3:size=160x120:rate=10 -c:v rawvideo -pix_fmt rgb24 testsrc.avi
    

    (The created video is uncompressed).
    Reference: https://trac.ffmpeg.org/wiki/FilteringGuide

  • Cut video into 3 parts (creating 3 video files):

    ffmpeg -i testsrc.avi -ss 00:00:00 -c copy -t 00:00:01 sec0.avi
    ffmpeg -i testsrc.avi -ss 00:00:01 -c copy -t 00:00:01 sec1.avi
    ffmpeg -i testsrc.avi -ss 00:00:02 -c copy -t 00:00:01 sec2.avi
    

    Reference: https://superuser.com/questions/138331/using-ffmpeg-to-cut-up-video

  • Concatenate (merge) 3 parts in reverse order:

    ffmpeg -i "concat:sec2.avi|sec1.avi|sec0.avi" -codec copy output.avi
    

    Note: for Linux use single quotes '
    Reference: Concatenate two mp4 files using ffmpeg

合成的视频看起来如下图所示:
enter image description here


5
对于任何参与本问题的人,请注意,我注意到Gyan的答案存在一个缺点,即在使用帧间编解码器时,inpoints和outpoints是近似的(请参见doc )。
以下命令(来自Ilogan的答案)不具有此缺点。它适用于单个或多个输入。
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 \ 
-filter_complex \
"[0:v]trim=3.48:5.72,setpts=PTS-STARTPTS[v0]; \
 [0:v]trim=6.56:8.68,setpts=PTS-STARTPTS[v0b]; \
 [1:v]trim=13.52:15.36,setpts=PTS-STARTPTS[v1]; \
 [1:v]trim=17.56:23.32,setpts=PTS-STARTPTS[v1b]; \
 [2:v]trim=20.6:23.96,setpts=PTS-STARTPTS[v2]; \
 [v0][v0b][v1][v1b][v2]concat=n=5:v=1:a=0[v]" \
-map "[v]" -an -crf 17 output.mp4

1
你的解决方案的缺点是需要重新编码视频,这可能对一些使用情况来说是可以接受的。 - Garuuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接