通过Golang exec运行FFMPEG命令

通过Golang exec运行FFMPEG命令,go,ffmpeg,Go,Ffmpeg,我需要运行一个命令,以创建一个视频从图像之间的交叉淡入淡出图像作为过渡。该命令由此派生。我需要在Golang软件包中运行它。我需要运行的命令是: ffmpeg -loop 1 -t 5 -i img-0.png -loop 1 -t 5 -i img-1.png -loop 1 -t 5 -i img-2.png -filter_complex "[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,

我需要运行一个命令,以创建一个视频从图像之间的交叉淡入淡出图像作为过渡。该命令由此派生。我需要在Golang软件包中运行它。我需要运行的命令是:

ffmpeg -loop 1 -t 5 -i img-0.png -loop 1 -t 5 -i img-1.png -loop 1 -t 5 -i img-2.png -filter_complex "[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v];[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v];[0:v][b1v][1:v][b2v][2:v]concat=n=5:v=1:a=0,format=yuv420p[v]" -map '[v]' -c:v libx264 -pix_fmt yuv420p -r 30 -s 1280x720 -aspect 16:9 -crf 1 -preset ultrafast output.mp4
如果您直接在终端中运行此命令,它就可以正常工作。但是,它不能通过我的代码工作。这是我的代码,它接受字符串命令并在包中运行:

当我运行这个程序时,我得到了ffmpeg错误:没有这样的过滤器:“”,配置过滤器时出错。我知道这与视频过滤器中必须包含的引号有关,但我已经尽了一切努力让它工作,但我无法理解


非常感谢您的帮助!

这确实可以正常工作:

exec.Command("ffmpeg", "-loop", "1", "-t", "5", "-i", "img-0.png", "-loop",  "1", "-t", "5", "-i", "img-1.png", "-loop", "1", "-t", "5", "-i", "img-2.png", "-filter_complex", "[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v];[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v];[0:v][b1v][1:v][b2v][2:v]concat=n=5:v=1:a=0,format=yuv420p[v]", "-map", "[v]", "-c:v", "libx264", "-pix_fmt", "yuv420p", "-r", "30", "-s", "1280x720", "-aspect", "16:9", "-crf", "1", "-preset", "ultrafast", "output.mp4")
请注意,我确实从
-filter\u complex
参数中删除了开始和结束双引号,并从
-map
参数中删除了两个单引号


不过,这是手工完成的,不确定是否有一个
strings
函数可以自动完成这项工作。

您的fields func没有删除引号。与其尝试对shell输入进行lex处理,为什么不使用一个正确执行的包,或者干脆将字符串传递给shell执行呢?我尝试在不使用引号的情况下运行该命令在筛选器复合体周围加引号,因为即使直接从终端工作,也会出现以下错误:缺少“')”或“gte”(T“[AVFilterGraph@0x3b94ee0]中的参数过多。初始化筛选器“blend”时出错,参数为“all_expr=A*(if(gte(配置过滤器时出错。是的,我不确定您试图用该开关实现什么,但我的感觉是您不应该有任何这样的功能。只需将“ffmpeg”作为第一个参数,然后使用反勾号来生成字符串文字(在这里不能这样做,因为标记将其生成代码段)因此,您可以在命令中保留必要的引号,并将ffmpeg之后的所有内容作为单个字符串传递,而不是将其分开,并尝试使用
部分[1:]分散数组…
。我认为您所做的工作超出了必要的范围,除非您真的需要微调这些参数。该开关通过尊重周围的引号将可能有空格的参数作为一个参数保留在一起。在shell中引用参数不会将引号传给程序。同样,您可以适当地对其进行lex,或者让shell为您运行命令。谢谢您的帮助。@MurtadhaS。您找到解决方案了吗?使用strings.replace不起作用
exec.Command("ffmpeg", "-loop", "1", "-t", "5", "-i", "img-0.png", "-loop",  "1", "-t", "5", "-i", "img-1.png", "-loop", "1", "-t", "5", "-i", "img-2.png", "-filter_complex", "[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v];[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v];[0:v][b1v][1:v][b2v][2:v]concat=n=5:v=1:a=0,format=yuv420p[v]", "-map", "[v]", "-c:v", "libx264", "-pix_fmt", "yuv420p", "-r", "30", "-s", "1280x720", "-aspect", "16:9", "-crf", "1", "-preset", "ultrafast", "output.mp4")