FFmpeg 连接不同时间的输出会导致空白流

FFmpeg 连接不同时间的输出会导致空白流

我正在开发一个视频编辑器,有一个时间轴。时间轴中的输入需要经过缩放过滤器。然后输出需要经过叠加过滤器。

它们会覆盖在 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

相关内容