我正在将视频生成库从NodeJS转换为GO,主要使用FFMPEG进行所有视频处理。我已经写完所有的FFMPEG命令来完成我想要的那一代。问题是当我尝试通过os/exec包运行命令时,它失败了。但是,如果我复制确切的命令并直接在终端中运行它可以工作,我无法弄清楚为什么会这样。我运行命令的代码如下:
command := "ffmpeg -y -loop 1 -i image.png -vf 'fade=in:0:15,fade=out:105:15' -c:v mpeg2video -t 5 -s 1280x720 -r 30 -q:v 1 -preset ultrafast image.mpg"
parts := strings.Fields(command)
cmd := exec.Command(parts[0], parts[1:]...)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
err := cmd.Run()
if err != nil {
panic(err)
}
我尝试运行此代码时遇到的ffmpeg错误是:
[AVFilterGraph @ 0x22a9bc0]没有这样的过滤器:' fade = in:0:15,fade = out:105:15'
打开过滤器时出错!
2016/08/17 17:48:53退出状态1
如前所述,如果我复制EXACT命令:
ffmpeg -y -loop 1 -i image.png -vf 'fade=in:0:15,fade=out:105:15' -c:v mpeg2video -t 5 -s 1280x720 -r 30 -q:v 1 -preset ultrafast image.mpg
直接在终端中运行它,没问题。
请帮助。
答案 0 :(得分:1)
当您使用strings.Fields(command)
时,字段将在空格上分割。这会导致parts
切片包含带引号的值'fade=in:0:15,fade=out:105:15'
。此完整值(带引号)将传递给命令无法识别的ffmpeg
命令。
shell会剥离这些引号并仅传递字符串fade=in:0:15,fade=out:105:15
,Go不会这样做。要修复,请尝试:
// remove the quotes around fade=in:0:15,fade=out:105:15
command := "ffmpeg -y -loop 1 -i image.png -vf fade=in:0:15,fade=out:105:15 -c:v mpeg2video -t 5 -s 1280x720 -r 30 -q:v 1 -preset ultrafast image.mpg"
parts := strings.Fields(command)