如何使用复杂过滤器在ffmpeg中的场景之间交叉淡入淡出?

scu*_*bed 3 ffmpeg

我有ffmpeg 2.1.4和输入电影in.mkv.in.mkv中有2个不同的场景.我希望能够在场景之间交叉淡入淡出,最好只使用复杂的过滤器而不是外部程序.从本质上讲,我希望有一些像叠加层,但阿尔法在特定时间发生变化.

考虑一下in.mkv是这样的:

00:00 - 00:05 scene 1
00:05 - 00:10 junk
00:10 - 00:15 scene 2
Run Code Online (Sandbox Code Playgroud)

所以,我想要一个输出:

00:00 - 00:04 scene 1 (0-4)
00:04 - 00:05 alpha fading between scene 1 (4-5) and 2 (10-11)
00:05 - 00:09 scene 2 (11-15)
Run Code Online (Sandbox Code Playgroud)

我看到有一个过滤器:overlay,alphamerge和color,但目前还不清楚这是怎么做到的.

通常,在ffmpeg中使用电影文件片段似乎很难.有没有办法说我正在拍摄相同输入文件的各个部分并将它们组合在一起而不将它们首先作为单独的电影渲染?

scu*_*bed 6

我让它像这样工作:

ffmpeg -f lavfi -i testsrc -ss 6 -f lavfi -i testsrc -filter_complex "
  color=white,fade=out:st=4:d=1[alpha];
  [0:v][alpha]alphamerge[am];
  [1:v][am]overlay=0:0
" -t 9 b.mkv
Run Code Online (Sandbox Code Playgroud)

所以,我有两个不同的输入相同的电影,但寻求时差,并使用白色淡出来生成alpha通道,然后将其与叠加层混合以交叉渐变.(我怀疑也可以使用geq.)

还有一个复杂的问题.如果您在进行交叉渐变之前进行搜索,则必须确保在帧之后寻找(因此请指定该帧何时应发生+ 1 ms)否则您可能会使目标四舍五入到源之前有一个帧,从而导致非常明显淡化开始时闪烁.

此外,如果还有音频流,可以通过添加到过滤器来交叉淡化它们:

[0:a]afade=out:d=2[a1];
[1:a]afade=in:d=2[a2];
[a1][a2]amix=inputs=2,volume=2
Run Code Online (Sandbox Code Playgroud)

您必须增加音量以补偿amix降低音量.

虽然,这似乎仍然比它应该更复杂.此外,这是否需要将视频解码两次并渲染一堆永远不会被看到的帧?