使用ffmpeg filter_complex对多视频输出进行不同的修剪

时间:2016-06-28 15:33:08

标签: video ffmpeg

我需要从公共输入源开始生成两个不同的视频。 为了简单起见,我们假设它们仅在开始时间和持续时间方面有所不同,但是生产代码更复杂,我必须使用filter_complex,因此没有-ss -to选项可用。

这是我目前的剧本:

/Users/Luca/Downloads/ffmpeg-macosx -y \
-i "/Users/Luca/Downloads/2_dongiovanni_mov.mov" \
-filter_complex "\
[0:v]split=2[v1][v4];\
[v1]\
scale='if(gt(a,1.7777777777778),640,-2)':'if(gt(a,1.7777777777778),-2,360)',\
trim=start=4:duration=10,\
setpts=PTS-STARTPTS\
[vout1];\
[v4]\
scale='if(gt(a,1.7777777777778),640,-2)':'if(gt(a,1.7777777777778),-2,360)',\
trim=start=0:duration=247,\
setpts=PTS-STARTPTS\
[vout4];\
[0:a]asplit=2[a1][a4];\
[a1]\
atrim=start=4:duration=10,\
asetpts=PTS-STARTPTS\
[aout1];\
[a4]\
atrim=start=0:duration=247,\
asetpts=PTS-STARTPTS\
[aout4]" \
-map [vout1] -map [aout1] -codec:v libx264 -b:v 1000k -codec:a aac -b:a 384k -strict experimental  "/Users/Luca/Downloads/preview.mp4" \
-map [vout4] -map [aout4] -codec:v libx264 -b:v 5000k -codec:a aac -b:a 384k -strict experimental  "/Users/Luca/Downloads/large.mp4" \
2>&1

preview.mp4([v1] [a1]段)没问题,因为它只持续10秒(并且从原始视频的第4秒开始)。音频也没关系。

large.mp4([v4] [a4])持续247秒,但视频在14秒内完全冻结(即第一次输出的4 + 10),而音频没有问题(持续247秒没有任何冻结)

在以下情况下按预期工作:

1)我删除了两个“缩放”过滤器

OR

2)我交换了“修剪”过滤器,所以基本上ffmpeg可以先处理最长然后最短处理(见下面的代码)

/Users/Luca/Downloads/ffmpeg-macosx -y \
-i "/Users/Luca/Downloads/2_dongiovanni_mov.mov" \
-filter_complex "\
[0:v]split=2[v1][v4];\
[v1]\
scale='if(gt(a,1.7777777777778),640,-2)':'if(gt(a,1.7777777777778),-2,360)',\
trim=start=0:duration=247,\
setpts=PTS-STARTPTS\
[vout1];\
[v4]\
scale='if(gt(a,1.7777777777778),640,-2)':'if(gt(a,1.7777777777778),-2,360)',\
trim=start=4:duration=10,\
setpts=PTS-STARTPTS\
[vout4];\
[0:a]asplit=2[a1][a4];\
[a1]\
atrim=start=0:duration=247,\
asetpts=PTS-STARTPTS\
[aout1];\
[a4]\
atrim=start=4:duration=10,\
asetpts=PTS-STARTPTS\
[aout4]" \
-map [vout1] -map [aout1] -codec:v libx264 -b:v 1000k -codec:a aac -b:a 384k -strict experimental  "/Users/Luca/Downloads/preview.mp4" \
-map [vout4] -map [aout4] -codec:v libx264 -b:v 5000k -codec:a aac -b:a 384k -strict experimental  "/Users/Luca/Downloads/large.mp4" \
2>&1

任何人都可以解释这个吗?

1 个答案:

答案 0 :(得分:3)

奇怪的行为。我可以使用最近的Windows二进制文件在这里重现它。您应该提交错误报告。

<强>变通方法

#1 在拆分之前放置比例并按所需顺序处理子流。

[0:v]scale='if(gt(a,16/9),640,-2)':'if(gt(a,16/9),-2,360)',split=2[v1][v4];\

#2 以所需顺序处理子流,但在修剪后放置缩放。

[v1]trim=..., scale=..., setpts=PTS-STARTPTS[vout1]; \
[v4]trim=..., scale=..., setpts=PTS-STARTPTS[vout2]; \

#3 如果直接使用输入,则无需拆分。

[0:v]scale=..., trim=..., setpts=PTS-STARTPTS[vout1]; \
[0:v]scale=..., trim=..., setpts=PTS-STARTPTS[vout2]; \