我有一个时长 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 秒),
hflip
并setpts
避免持续时间问题(输出修剪为[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
有些过滤器通过以下方式提供时间线支持启用选项。
您可以使用 来查看过滤器列表,以及它们是否支持时间线。过滤器名称前面的ffmpeg -filters
“ ”表示它支持时间线编辑。如果您所需的过滤器不支持时间线,请更新您的过滤器,因为过滤器有时会更新以支持此功能。否则,请使用其他答案中所述的修剪过滤器。T
ffmpeg
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