确定从 FFMPEG 输出到管道的多个流的顺序

确定从 FFMPEG 输出到管道的多个流的顺序

我目前正在运行 ffmpeg,以视频作为输入并通过复杂的过滤器:

  • 将其拆分成多个流
  • 对于每个流,应用一组过滤器(每个过滤器执行不同的变换)

之后,我映射每个流以输出一系列 PNG 图像。

目前,我将所有内容写入pipe:1stdout),以便启动 ffmpeg 的程序可以处理输出。

每个流都需要在调用程序中单独处理。

因此,我想给 PNG 贴上标签,以识别应如何处理它们(这样我就可以在合并的输出流中正确排序它们)。PNGtEXt中的块类型非常适合此目的。

问题是,我如何让 ffmpeg 将该块(或其他元数据)编码到 PNG 中?

目前,我正在尝试以下操作:

ffmpeg \
    -ss <start time, put before input to seek by keyframes> \
    -to <end time> \
    -i <input, this is downloaded from an HTTPS URL> \
    -filter_complex \
        split=2[in1][in2];[in1]<some filter>[out1];[in2]<some other filter>[out2] \
    -map [out1] -metadata title=<tag1> -codec png -f image2pipe pipe:1 \
    -map [out2] -metadata title=<tag2> -codec png -f image2pipe pipe:1

但它不会在传输到管道的 PNG 中创建任何额外的块。

我也尝试过metadata过滤器,如下所示:

ffmpeg \
    -ss <start time, put before input to seek by keyframes> \
    -to <end time> \
    -i <input> \
    -filter_complex \
        split=2[in1][in2];[in1]<some filter>,metadata=add:key=mykey:value=mytag1[out1];[in2]<some other filter>,metadata=add:key=mykey:value=mytag2[out2] \
    -map [out1] -metadata title=<tag1> -codec png -f image2pipe pipe:1 \
    -map [out2] -metadata title=<tag2> -codec png -f image2pipe pipe:1

但这不会在 PNG 流中产生任何额外的元数据。

这是可能的吗,还是我必须找到另一种方法来分离流并处理它们?

答案1

你可以交错它们

ffmpeg \
    -i <input> \
    -filter_complex \
        split=2[in1][in2];[in1]<some filter>[out1];[in2]<some other filter>[out2]; \
       [out1][out2]interleave,setpts=N/25/TB[out] \
    -map [out] -r 25 -codec png -f image2pipe pipe:1

这将有一个 out1 帧,接着是 out2,然后是 out1...等等

相关内容