解释:

解释:

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

因此,如果将整个内容从左到右翻转,我只想应用:

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

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

我正在寻找有关此问题的一些文档,但找不到任何类似的东西,想知道这是否在 FFmpeg 中不可能实现。

答案1

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

这里,-filter_complex是您的好朋友,因为它可以创建过滤输入链。我们仍将hflip在 filtergraph 中使用问题中提到的过滤器。

您可以像这样申请到子部分:

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

一行即可轻松复制粘贴:

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

解释:

使用 filtergraph 有点像创建一系列动作,在‘过滤介绍’部分过滤器文档。过滤器适用于输入- 这是您在过滤器之前看到的位,例如[0:v](第一个输入流的视频)或[a](名为的创建的输出a) - 和输出也就是说,输入或者输入根据 a 进行转换filter,然后输出为输出或者输出

这里有一组简单的动作,如果我们按顺序执行这些动作,我们就可以建立一个输入和输出的过滤图。

细分

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

  • 第一段(90 秒),不执行任何操作(输出为[a]
  • 第二段(30 秒),hflipsetpts避免持续时间问题(输出修剪为[b]并将其传递给hflip输出为[c]

然后将这两者concat合并在一起形成输出[a]+[c] -> [d](持续时间:120 秒)

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

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

这样你会得到一个与原始视频时长相同(180 秒)的视频,但中间有一段 30 秒的视频水平翻转了2


1

视觉表现ffmpeg过滤器文档

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

                [main]
input --> split ---------------------> overlay --> output
            |                             ^
            |[tmp]                  [flip]|
            +-----> crop --> vflip -------+

此 filtergraph 将输入流分成两个流,然后将一个流发送通过 crop 过滤器和 vflip 过滤器,然后通过将其叠加在顶部将其与另一个流合并。


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

答案2

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

有些过滤器通过以下方式提供时间线支持启用选项

您可以使用 来查看过滤器列表,以及它们是否支持时间线。过滤器名称前面的ffmpeg -filters“ ”表示它支持时间线编辑。如果您所需的过滤器不支持时间线,请更新您的过滤器,因为过滤器有时会更新以支持此功能。否则,请使用其他答案中所述的修剪过滤器。Tffmpeg

ffmpeg例子:

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

ffplay例子:

ffplay -vf "hflip=enable='between(t,90,120)'" input

相关内容