问题描述
我有一个给定的源视频,总共 30 秒。 现在我想修剪前 5 秒并对其应用回旋镖效果。这是我目前所在的命令:
ffmpeg -i src.mp4 -y -an -filter_complex "[0]trim=start=0:end=5[a];[a]reverse[r];[a][r]concat,loop=0:250,setpts=N/30/TB" out.mp4
我对 ffmpeg 比较陌生,我试图了解原理,但我有点挣扎。阅读一些文档后,我了解到第一个括号 [0] 是操作的源流,前导结束括号是输出流名称,因此我可以继续使用 concat 等其他操作处理它。
这就是我对 [a] 的尝试,它应该作为我修剪后的视频的输出流。但这并不奏效。
我发现的另一种方法是使用 -ss 0 -t 5
,但这会在处理结束时对其进行修剪,这是低效的,因为 ffmpeg 会在整个 30 秒内应用我的操作,然后丢弃 25 秒.
我理解错了什么,我该如何解决?
解决方法
类似的东西?
ffmpeg -i src.mp4 -filter_complex "
[0]trim=start=0:end=5[a];
[0]trim=start=0:end=5,reverse[b];
[a][b]concat
" -an out.mp4 -y -hide_banner
,
我发现的另一种方法是使用 -ss 0 -t 5
,但这会在处理结束时对其进行修剪,这是低效的,因为 ffmpeg 会在整个 30 秒内应用我的操作,然后丢弃 25 秒.
请记住,所有标志都适用于 next 输入/输出文件。
如果您只想读取输入文件的前 5 秒,则必须将 -ss 0 -t 5
放在 -i
标志之前:
ffmpeg -ss 0 -t 5 -an -i src.mp4 -y -filter_complex "[0]split[b][c];[c]reverse[r];[b][r]concat" out.mp4
这将仅在 src.mp4
的前 5 秒运行过滤器链。
如果将 -ss 0 -t 5
放在输入文件之后,它将改为应用于输出 out.mp4
,因此将处理完整的输入文件,但仅将结果的前 5 秒写入 { {1}}。