Golang 命令在终端中工作但不与 exec 包一起工作

Golang command working in terminal but not with exec package

我正在将视频生成库从 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] No such filter: 'fade=in:0:15,fade=out:105:15'

Error opening filters!

2016/08/17 17:48:53 exit status 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

和运行它直接在终端里,没问题。

请帮忙。

当您使用 strings.Fields(command) 时,字段将按空格拆分。这导致 parts 切片包含值 'fade=in:0:15,fade=out:105:15',带引号。此完整值(带引号)正在传递给 ffmpeg 命令,该命令无法识别。

A 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)