FFmpeg:可以在转码时仅将过滤器应用于视频文件的一部分

Roy*_*end 13 video ffmpeg

我有一个 3:00 分钟的短片,中间只从左到右翻转了大约 30 秒。

所以如果整个事情从左到右翻转,我只想申请:

ffmpeg -i 3min.mp4 -vf hflip flipped_3min.mp4

但是由于它只是部分翻转,有没有办法在单个 ffmpeg 命令中为该 hflip 过滤器(1:30-2:00)应用时间段?

我正在寻找有关此的一些文档,但找不到任何此类内容,我想知道在 FFmpeg 中是否不可能。

ber*_*ieb 16

如何使用 仅翻转视频的一部分ffmpeg

-filter_complex是你的朋友,因为它可以创建过滤输入链。我们仍将使用hflipfiltergraph 中问题中提到的过滤器。

您可以像这样申请一个小节:

ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];\
[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];\
[b]hflip[c];\
[a][c]concat[d];\
[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];\
[d][e]concat[out1]" -map [out1] flip.mp4
Run Code Online (Sandbox Code Playgroud)

一行便于复制+粘贴:

ffmpeg  -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];[b]hflip[c];[a][c]concat[d];[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];[d][e]concat[out1]" -map [out1] flip.mp4
Run Code Online (Sandbox Code Playgroud)

解释:

使用过滤器图有点像创建一系列操作,过滤器文档的“过滤介绍”部分中有一个很好的视觉解释1。过滤器与输入一起工作- 这是您在过滤器之前看到的位,例如(第一个输入流的视频)或(创建的名为 的输出) - 和输出。也就是说,一个输入输入根据变换,然后输出或者作为输出输出[0:v][a]afilter

我们在这里有一组简单的操作,如果我们按顺序执行这些操作,我们可以构建输入和输出的过滤器图。

细分市场

使用以下方法创建 3 个视频片段(来自输入[0:v]trim

  • 第一段(90 秒),什么都不做(输出为[a]
  • 第二段(30 秒),hflipsetpts避免持续时间问题(输出修剪为[b]并将其传递hflip给输出为[c]

然后将这两个concat一起编辑以生成输出[a]+[c] -> [d](持续时间:120 秒)

  • 第三段(60秒),再次设置PTS(输出为[e]

连接段以生成 output [d] + [e] -> [out1],并将-map其连接到文件中的最终输出。

这为您提供了与原始视频具有相同持续时间(180 秒),但中间有 30 秒的部分水平翻转2


1

过滤器文档中的可视化表示ffmpeg

在 中libavfilter,过滤器可以有多个输入和多个输出。为了说明可能发生的事情,我们考虑以下过滤器图。

                [main]
input --> split ---------------------> overlay --> output
            |                             ^
            |[tmp]                  [flip]|
            +-----> crop --> vflip -------+
Run Code Online (Sandbox Code Playgroud)

此过滤器图将输入流拆分为两个流,然后通过裁剪过滤器和 vflip 过滤器发送一个流,然后通过将其覆盖在顶部将其与另一个流合并。


2测试使用ffmpeg version N-72939-g5b0f55a


llo*_*gan 14

在此示例中,水平翻转发生在 2-3 秒之间。
在此示例中,水平翻转发生在 2-3 秒之间。

一些过滤器通过启用选项支持时间线。

您可以查看过滤器列表,以及它们是否具有时间轴支持ffmpeg -filtersT过滤器名称前面的“ ”表示它支持时间线编辑。如果您想要的过滤器没有时间线支持,那么更新您的ffmpeg过滤器有时会更新以支持这一点。否则,请使用其他答案中所述的修剪过滤器。

ffmpeg 例子:

ffmpeg -i input -vf "hflip=enable='between(t,90,120)'" -c:a copy output
Run Code Online (Sandbox Code Playgroud)

ffplay 例子:

ffplay -vf "hflip=enable='between(t,90,120)'" input
Run Code Online (Sandbox Code Playgroud)