为什么ffmpeg中的sendcmd
与drawtext
一起使用,但不适用于scale
,rotation
和其他过滤器?
示例(此代码有效)
ffmpeg -i testIN.mp4 -filter_complex "[0:v]sendcmd=f=testTXT.cmd,drawtext=fontfile=PF.ttf:text='': fontcolor=white:fontsize=150" testOUT.mp4
testTXT.cmd
0 drawtext reinit 'text=111';
1 drawtext reinit 'text=222';
2 drawtext reinit 'text=333';
示例(此代码不起作用)
ffmpeg -i testIN.mp4 -filter_complex "[0:v]sendcmd=f=testTXT.cmd,drawbox=x=10:y=10:w=100:h=100" testOUT.mp4
testTXT.cmd
0 drawbox reinit 'x=20:y=20:w=200:h=200';
1 drawbox reinit 'x=30:y=30:w=300:h=300';
2 drawbox reinit 'x=40:y=40:w=400:h=400';
答案 0 :(得分:1)
您遇到了几个问题:
并非所有过滤器都支持sendcmd。您可以使用ffmpeg -filters
查看哪些过滤器支持sendcmd。在过滤器名称的左侧查找“C
”。此外,sendcmd只能使用某些过滤器选项(aka sendcmd“命令”)。请参阅FFmpeg filter documentation,或参阅man ffmpeg-filters
,并查看每个过滤器的命令部分下的可用选项。
必须在sendcmd文件中声明每个过滤器命令。文档示例中显示的reinit
似乎仅限于drawtext过滤器,但文档中未对此进行说明。
示例sendcmd文本文件:
0 rotate angle '45*PI/180';
1 rotate angle '90*PI/180';
2 rotate angle '180*PI/180';
示例ffmpeg
命令:
ffmpeg -i input.mp4 -filter_complex "[0:v]sendcmd=f=test.cmd,rotate" output.mp4
以上示例将轮播持续时间0
,1
和2
。
示例sendcmd文本文件:
0
overlay@1 x 10,
overlay@1 y 10,
overlay@2 x W-w-10,
overlay@2 y H-h-10,
overlay@3 x (W-w)/2,
overlay@3 y (H-h)/2;
# overlay@1 does not move at this duration so it needs no new entry here
2.25
overlay@2 x 10,
overlay@2 y H-h-10,
overlay@3 x (W-w)/2,
overlay@3 y H-h-10;
示例ffmpeg
命令:
ffmpeg -i video.mp4 -i overlay1.png -i overlay2.jpg -i overlay3.png -filter_complex "[0:v]sendcmd=f=test.cmd,nullsink;[0:v][1:v]overlay@1[bg1];[bg1][2:v]overlay@2[bg2];[bg2][3:v]overlay[v]" -map "[v]" -map 0:a? -c:a copy output.mp4