我希望在特定的时间间隔将ffmpeg中的滤镜添加到rtmp流中,比如每10秒钟10秒。我尝试了两种方法。第一个:
-vf "color=#8EABB8@0.9:480x208,select='gte(t,10)*lte(t,20)' [color];[in][color] overlay [out]"
这只会流式选择指示的10秒,并应用滤镜而不是播放整个流,并将滤镜应用到这20秒。
然后我学会了split和fifo并尝试了这种方法:
-vf "[in] split [no-color], fifo, [with-color] overlay [out]; [no-color] fifo, select='gte(t,10)*lte(t,20)' [with-color]"
我希望这可以播放整个流,然后选择指定的10秒以便我可以应用过滤器,但它与第一种方法相同,只播放选定的10秒而不是整个流。
提前致谢。
答案 0 :(得分:3)
正如this question所述,似乎没有办法将视频过滤器应用于视频流的特定时间段,而不是将其拆分为片段,应用过滤器和重新组合。如果您找到更好的方法,请分享。
答案 1 :(得分:2)
您更改了进入叠加层的流的顺序。
似乎如果“select
”ed流作为overlay
过滤器的第一个输入,则叠加层也会在非选定时间内清空其输出。
但是如果你首先向overlay
提供一个稳定的流然后选择它,它将在整个时间内输出一个流。
我尝试了以下一组过滤器:
-vf "[in]split[B1][B2];[B1]fifo,drawbox=-1:-1:5000:5000:invert:2000,vflip,hflip[B1E];[B2]fifo,select='gte(t,5)'[B2E];[B1E][B2E]overlay[out]"
我的版本为图表:
_,--[B1]--fifo--drawbox--flip--[B1E]--._
[in]---split--X X--overlay--[out]
‾'--[B2]--fifo--select---------[B2E]--'‾
您的版本是(选择过滤器是第一个overlay
输入!!):
_,--fifo--select---[with-color]--._
[in]---split--X X--overlay--[out]
‾'--[no-color]--fifo-------------'‾
原因是
...[B2E];[B1E][B2E]overlay...
和
...,[B1E]overlay...
是等价的。
但是仍然存在一些问题:你需要一次还是每10秒,e。克。?
答案 2 :(得分:1)
我正在处理类似的问题,我使用过滤器slpit,overlay和concat的组合,它可以工作,你可以试试。
-filter_complex "[0:v]split[v1][v2];[v1]select='lt(t,5)',setpts=PTS-STARTPTS[iv1];[v2]select='gte(t,5)'[over];[over][1:v] overlay=W-w:H-h:shortest=1,setpts=PTS-STARTPTS[iv2];[iv1][iv2]concat=n=2:v=1:a=0"
但我的问题是,我使用gif作为第二个输入,因为它包含透明的颜色信息,但gif文件不包含音频。如何用透明(或alpha)和音频制作电影?