使用交叉淡化和普通切割将视频与ffmpeg相结合

时间:2016-03-07 19:45:55

标签: linux video scripting ffmpeg video-editing

我正在编写一个脚本,将S3中的任意视频文件组合/切片成一个输出视频。到目前为止,我这样做是首先使用ffmpeg -i input-X.mp4 -ss start -t duration slice-X.mp4将视频剪裁到适当的长度,并使用ffmpeg concat过滤器重新组合生成的切片。

我希望能够在视频之间进行交叉淡入淡出和剪切。 concat不支持转换。在Linux命令行中将视频与交叉淡化和剪切相结合的最佳方法是什么? ffmpeg是这项工作的最佳工具吗?

我的问题与"How do you create a crossfade transition between multiple videos in FFMPEG?"类似,但我不一定需要使用ffmpeg。此外,我希望能够在一些切片之间淡入淡出并在其他切片之间切换。

2 个答案:

答案 0 :(得分:3)

下面是单步命令模板,假设有五个切片。

ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 \
-filter_complex \
"[0:v]trim=0.5:4.5,setpts=PTS-STARTPTS[1]; \
 [1:v]trim=12:17,setpts=PTS-STARTPTS+(3/TB),format=yuva420p,fade=in:st=3:d=1:alpha=1[2]; \
 [2:v]trim=34.1:36,setpts=PTS-STARTPTS+(7/TB),format=yuva420p,fade=in:st=7:d=1:alpha=1[3]; \
 [3:v]trim=21:25,setpts=PTS-STARTPTS[4]; \
 [4:v]trim=27:31,setpts=PTS-STARTPTS+(3/TB),format=yuva420p,fade=in:st=0:d=1:alpha=1[5]; \
 [0:a]atrim=0.5:4.5,asetpts=PTS-STARTPTS[1a]; \
 [1:a]atrim=12:17,asetpts=PTS-STARTPTS[2a]; \
 [2:a]atrim=34.1:36,asetpts=PTS-STARTPTS[3a]; \
 [3:a]atrim=21:25,asetpts=PTS-STARTPTS[4a]; \
 [4:a]atrim=27:31,asetpts=PTS-STARTPTS[5a]; \
 [1][2]overlay,format=yuv420p[12]; \
 [12][3]overlay,format=yuv420p[123]; \
 [4][5]overlay,format=yuv420p[45]; \
 [1a][2a]acrossfade=d=1[12a]; \
 [12a][3a]acrossfade=d=1[123a]; \
 [4a][5a]acrossfade=d=1[45a]; \
 [123][123a][45][45a]concat=n=2:v=1:a=1[v][a]" \
-map [v] -map [a] SingleStepOutput.mp4

我已多次输入视频,每次切片一次,因为使用单个输入板(即使使用split / asplit)会导致缓冲区溢出。

使用setpts / asetpts过滤器,因为trim / atrim会占用原始时间戳。 setpts过滤器对于必须淡入的切片是偏移的。偏移值是preceding slide duration - crossfade duration。需要yuva420p来创建一个alpha通道,其值实际上由淡入淡出过滤器调制。

答案 1 :(得分:0)

我最终通过迭代每个切片并将每个切片附加到临时输出文件来完成此操作。

  

[输出]< - 复制切片1
  [输出]< - 切片2开到输出
  [输出] [切片2]< - 渐变切片3开到输出
  [输出] [切片2] [交叉淡化] [切片3]< - 淡化切片4到输出等...

所以 n ffmpeg指令将输入视频切片到正确的长度,然后 n-1 ffmpeg指令将它们连接到适当的转换