sendfd在ffmpeg中

时间:2018-03-30 21:47:16

标签: video ffmpeg

为什么ffmpeg中的sendcmddrawtext一起使用,但不适用于scalerotation和其他过滤器?

示例(此代码有效)

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';

1 个答案:

答案 0 :(得分:1)

您遇到了几个问题:

  1. 并非所有过滤器都支持sendcmd。您可以使用ffmpeg -filters查看哪些过滤器支持sendcmd。在过滤器名称的左侧查找“C”。此外,sendcmd只能使用某些过滤器选项(aka sendcmd“命令”)。请参阅FFmpeg filter documentation,或参阅man ffmpeg-filters,并查看每个过滤器的命令部分下的可用选项。

  2. 必须在sendcmd文件中声明每个过滤器命令。文档示例中显示的reinit似乎仅限于drawtext过滤器,但文档中未对此进行说明。

  3. 旋转示例

    示例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
    

    以上示例将轮播持续时间012

    叠加示例

    示例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