代码之家  ›  专栏  ›  技术社区  ›  Qandeel Abbassi

如何在一个ffmpeg命令中在不同的时间将两个视频覆盖到另一个视频上?

  •  4
  • Qandeel Abbassi  · 技术社区  · 7 年前

    使用ffmpeg命令行,我想在不同的时间、不同的持续时间将两个不同的视频叠加在另一个视频(主视频)上。我已使用以下命令在特定时间和特定持续时间在主视频上成功覆盖了1个视频:

    ffmpeg -i main.mp4 -i first.mp4 \
    -filter_complex "[1:v]setpts=PTS-32/TB[a]; \
                     [0:v][a]overlay=enable=gte(t\,5):eof_action=pass[out]; \
                     [1] scale=480:270 [over]; [0][over] overlay=400:400" \
    -map [out] -map 0:a \
    -c:v libx264 -crf 18 -pix_fmt yuv420p \
    -c:a copy \
    output.mp4
    

    如何修改同一命令以同时对两个辅助视频应用相同的操作?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gyan    7 年前

    命令的更正版本:

    ffmpeg -i main.mp4 -i first.mp4 \
    -filter_complex "[1:v]setpts=PTS-32/TB,scale=480:270[a]; \
                     [0:v][a]overlay=400:400:enable=gte(t\,5):eof_action=pass[out]" \
    -map [out] -map 0:a \
    -c:v libx264 -crf 18 -pix_fmt yuv420p \
    -c:a copy \
    output.mp4
    

    对于两个次要视频,

    ffmpeg -i main.mp4 -i first.mp4 -i second.mp4 \
    -filter_complex "[1:v]setpts=PTS-32/TB,scale=480:270[a]; \
                     [2:v]setpts=PTS-32/TB,scale=480:270[b]; \
                     [0:v][a]overlay=400:400:enable=gte(t\,5):eof_action=pass[out0]; \
                     [out0][b]overlay=400:400:enable=gte(t\,5):eof_action=pass[out]" \
    -map [out] -map 0:a \
    -c:v libx264 -crf 18 -pix_fmt yuv420p \
    -c:a copy \
    output.mp4
    

    您必须调整第二个叠加的PTS、比例、位置和计时,以确保它与第一个叠加不重叠。