ffmpeg:drawtext 使用 zmq 淡入淡出 in/out

ffmpeg: drawtext fade in/out with zmq

在 ffmpeg 中有几种淡入淡出文本的方法。但我只找到了实际时间已知的解决方案。

但是,当我不知道当前 运行ning 时间并且我想淡入和淡出文本时,我该怎么办?

假设我有一个无穷无尽的流,我想用 zmqsend 淡入文本。淡入淡出应该立即开始。为此,我的理解是,我需要将一些时间信息存储在一个变量中并用它来计算。但是在 ffmpeg 表达式中存储变量是不可能的 - 对吧?

出于测试目的,这里有一个播放实例:

ffplay -dumpgraph 1 -f lavfi "color=s=512x288:c=black,zmq,drawtext=text=''"

为了使用 zmq 添加一些文本,我现在可以 运行:

echo Parsed_drawtext_2 reinit text="Hello\ World,\ what’s\ up?" | zmqsend

或者如果我知道 运行 宁时间并且在 10 秒后我希望文本淡入:

"text='Hello\ World':fontsize=:fontcolor=ffffff:alpha='if(lt(t,10),0,if(lt(t,11),(t-10)/1,if(lt(t,16),1,if(lt(t,17),(1-(t-16))/1,0))))'"

我现在的目标是表达我可以发送的内容,以便 ffmpeg 开始在文本中淡入淡出并在一定时间后淡出。

类似于:

now=t,if(lt(t,now+10),0,if(lt(t,now+11),(t-(now+10))/1,if(lt(t,now+16),1,if(lt(t,now+17),(1-(t-(now+16)))/1,0))))

有没有办法在表达式中存储变量,或者有没有其他方法可以实现这个?

表达式可以存储 10 'registers' 个变量,编号为 0 到 9。函数是 st(n,value) 存储和 ld(n) 从寄存器 n 加载值。寄存器不在表达式之间共享,因此 alpha 表达式中的寄存器在 fontcolor expr..etc

中不可用

所以,你可以像这样开始 expr

'ifnot(ld(1),st(1,t));if(lt(t,ld(1)+10),0,if(lt(t,ld(1)+11),...'