【问题标题】:Cut multiple videos and merge with ffmpeg剪切多个视频并与 ffmpeg 合并
【发布时间】:2021-03-11 22:17:38
【问题描述】:

如何将视频剪切成多个部分,然后将它们组合在一起以使用 ffmpeg 制作新视频?

【问题讨论】:

    标签: video ffmpeg


    【解决方案1】:

    您可以使用 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
    

    【讨论】:

    • 运行命令后 *** ffmpeg -f concat -i list.txt combine.mp4 *** 然后我想运行命令 *** ffmpeg -i combine.mp4 -i background.mp4 - filter_complex "[0:v] scale=400:400 [v1], [1:v][v1]overlay=0:0" -shortest -preset superfast "output.mp4" *** ||让两行代码在 .bat 目录中运行 我应该怎么做才能将这两行代码连接在一起?感谢帮助
    • 当我运行命令 #2b 时:错误命令:找不到选项循环。运行命令 *** ffmpeg -f concat -i list.txt combined.mp4 *** 然后我想运行命令 *** ffmpeg -i 12m.mp4 -i combined.mp4 -vf setpts=(PTS-STARTPTS) /1.1 -af atempo=1.1 -map 1:v -map 0:a -shortest new.mp4 *** ||让两行代码在 .bat 目录中运行我应该怎么做才能将这两行连接在一起?
    • 更正了 cmd 并添加了新的。
    • 你好 Mulvya 当我创建 list.txt 如果其他文件夹中的每个视频(例如:D:\video1 和 D:\video2)我该怎么办?示例文本列表:文件 D:\video1\videoa inpoint 34.5 outpoint 55.1 file D:\video1\videob inpoint 278 outpoint 316.4
    • 在 cmd 行的 -i 之前添加 -safe 0
    【解决方案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

    合成视频如下图所示:

    【讨论】:

      【解决方案3】:

      对于任何进入这个问题的人,我注意到 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-28
        • 2017-03-20
        • 2018-12-22
        • 2017-07-08
        • 2015-05-06
        • 2016-06-13
        • 2018-11-08
        相关资源
        最近更新 更多