我目前正在运行 ffmpeg,以视频作为输入并通过复杂的过滤器:
- 将其拆分成多个流
- 对于每个流,应用一组过滤器(每个过滤器执行不同的变换)
之后,我映射每个流以输出一系列 PNG 图像。
目前,我将所有内容写入pipe:1
(stdout
),以便启动 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...等等