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

时间:2016-08-17 17:57:17

标签: go ffmpeg exec

我正在将视频生成库从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

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

请帮助。

1 个答案:

答案 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)