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