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



我需要从一个共同的输入源开始生成两个不同的视频。为了简单起见,我们假设它们只在开始时间和持续时间上不同,但是生产代码更复杂,我必须使用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)我删除了两个"缩放"过滤器

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

有人能解释一下吗?

行为怪异。我可以在这里用最近的Windows二进制文件复制它。你应该提交一个bug报告。

工作区

#1在分割和处理子流之前放置刻度

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

#2按所需顺序处理子流,但在trim之后放置scale。

[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]; 

相关内容

  • 没有找到相关文章

最新更新