剪切多个视频并与ffmpeg合并

时间:2017-03-12 13:22:46

标签: video

我有一个视频 我想把它分成许多部分,然后联合起来制作一个新的视频 我该怎么办 ?我用 谢谢 ?请帮助我

3 个答案:

答案 0 :(得分:6)

您可以使用concat demuxer。

#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

答案 1 :(得分:2)

你的问题是安静的将军...
以下示例可能对您有所帮助,但它可能无法解决您的具体问题。

该示例适用于三个阶段:

  • 创建合成视频(没有音频):

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

    (创建的视频未压缩) 参考:https://trac.ffmpeg.org/wiki/FilteringGuide

  • 将视频分为3部分(创建3个视频文件):

    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
    

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

  • 以相反的顺序连接(合并)3个部分:

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

    注意:对于Linux,请使用单引号'
    参考:Concatenate two mp4 files using ffmpeg

合成视频如下图所示:
enter image description here

答案 2 :(得分:2)

对于任何涉及此问题的人,我注意到 Gyan 的答案有一个缺点,即在帧间编解码器的情况下,入点和出点是近似值(请参阅 doc)。

以下命令(来自 Ilogan's answer)没有这个缺点。它适用于一个或多个输入。

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