我正在开发一个视频编辑器,有一个时间轴。时间轴中的输入需要经过缩放过滤器。然后输出需要经过叠加过滤器。
它们会覆盖在 1080x1080 的空白背景上。然后两个输出之间可能会有过渡。
所以我以编程方式构建了这个命令。我发现这样使用它更容易。这在逻辑上对我来说很有意义。我不确定为什么当我连接输出时,最终会得到一个空白的白色流。
这肯定和这里的事件顺序有关。也许在连接时覆盖和中间过滤器会丢失?
ffmpeg
-i "0.jpg"
-i "1.jpg"
-f lavfi
-i color=c=white:s=1080x1080
-filter_complex "
// first scale all media inputs (2 in this case)
[0:v]scale=1194:1490[out1],
[1:v]scale=1176:1763[out2],
// overlay the new outputs onto the blank canvas setting a time
[2:v][out1]overlay=-56:-119:enable='between(t,0,5)'[out101],
[2:v][out2]overlay=-47:-250:enable='between(t,5.01,10)'[out102],
// if there was a transiton between the first input and second
// ... [out101][out102]gltransition=duration=1[main] DONE
// in this case there is no transition so we just concat
[out101][out102]concat=n=2[main]
"
-map "[main]"
-ac 2
-vcodec libx264
-preset veryfast
-crf 27
-pix_fmt yuv420p
-vb 20M
-t 00:00:10
out.mp4
这种模式对我来说效果很好,因为我可以轻松选择在哪两个输出之间进行转换,创建新的输出,然后连接其余的输出。我认为我的想法是正确的。
问题似乎是enable='between()'
当我重新连接流时丢失了。
因此,我想知道,在我的逻辑中,哪里出了问题导致了这个问题?
以下是上述命令的结果示例https://storycreatoruploads2.s3.us-west-2.amazonaws.com/e236ff60-55b8-11ea-aa4b-91efa707fae7
干杯!
答案1
1)它-f lavfi -i color=c=white:s=1080x1080
会产生一个长度不定的白色视频流,所以它永远不会终止。
2) 所做[2:v][out1]overlay=-56:-119:enable='between(t,0,5)'[out101]
的就是将图像 0.jpg 叠加在时间戳 0 到 5 秒上2:v
。但是,过滤器的寿命与较长的输入(颜色输入)的持续时间一样长,因此不确定。enable 所做的只是决定合成何时发生。
3) concat 过滤器在当前片段结束时切换到下一个片段。第一个片段永远不会结束,因此当 ffmpeg 停止在 时-t 00:00:10
,concat 仍会从第一个片段发送帧 - 前 5 秒带有叠加图像 0,然后是基本白色流。
4) 如果通过将第一个段设置为有限长度来纠正此问题,则 concat 将从下一个段的时间戳 0 开始拼接段,并且下一个段的启用状态为between(t,5.01,10)
,因此如果您的-t
时长达到 15 秒,您将看到前 5 秒为 0.jpg,然后是 5 秒的白色,然后是 5 秒的 1.jpg
大体上,有两种方法可以解决这个问题。将每个新图像叠加在上一次叠加的结果上,或者将每个图像叠加在不同的流上,修剪这些结果,然后连接起来。
覆盖,顺序如下:
ffmpeg
-loop 1 -i "0.jpg"
-loop 1 -i "1.jpg"
-f lavfi
-i color=c=white:s=1080x1080
-filter_complex "
[0:v]scale=1194:1490[out1];
[1:v]scale=1176:1763[out2];
[2:v][out1]overlay=-56:-119:enable='between(t,0,5)'[out101];
[out101][out2]overlay=-47:-250:enable='between(t,5.01,10)'[main]
"
-map "[main]"
-ac 2
-vcodec libx264
-preset veryfast
-crf 27
-pix_fmt yuv420p
-vb 20M
-t 00:00:10
out.mp4
连接:
ffmpeg
-i "0.jpg"
-i "1.jpg"
-f lavfi
-i color=c=white:s=1080x1080
-filter_complex "
[0:v]scale=1194:1490[out1];
[1:v]scale=1176:1763[out2];
[2:v][out1]overlay=-56:-119,trim=duration=5[out101];
[2:v][out2]overlay=-47:-250,trim=duration=5[out102];
[out101][out102]concat=n=2[main]
"
-map "[main]"
-ac 2
-vcodec libx264
-preset veryfast
-crf 27
-pix_fmt yuv420p
-vb 20M
-t 00:00:10
out.mp4