无法执行ffprobe命令

时间:2019-11-12 17:02:44

标签: go cmd ffprobe

我尝试使用ffprobe获取视频文件的持续时间。当我运行此代码时,出现错误:

  

退出状态1:

var out bytes.Buffer
var stderr bytes.Buffer

cmdArgs := []string{"-i", "bunny.mp4", "-show_entries", "format=duration", "-v", "quiet", "-of", `csv="p=0"`}

cmd := exec.Command("ffprobe", cmdArguments...)
cmd.Stdout = &out
cmd.Stderr = &stderr
if err := cmd.Run(); err != nil {
    fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
}
fmt.Printf("command output: %q\n", out.String())

但是当我像这样传递没有-of csv="p=0"的参数时:

cmdArgs := []string{"-i", "bunny.mp4", "-show_entries", "format=duration", "-v", "quiet"}

它可以工作并返回结果(但格式错误):

  

命令输出:“ [FORMAT] \ nduration = 3.008000 \ n [/ FORMAT] \ n”

那是什么问题以及如何解决?

1 个答案:

答案 0 :(得分:2)

尝试像这样格式化参数(对字符串使用双引号而不是反引号,并删除内部双引号):

cmdArgs := []string{..., "csv=p=0"}

Go exec包不会调用系统外壳程序来处理参数,因此在指定它们时无需采取相同的预防措施。在这种情况下,无需在引号中的第一个“ =”之后包裹该部分。

来自the package documentation

  

与使用C和其他语言进行的“系统”库调用不同,   os / exec软件包有意不调用系统外壳程序,并且   不会展开任何glob模式或处理其他扩展,   管道,或通常由Shell完成的重定向。包装   行为更像C的“ exec”函数系列。扩大球   模式,要么直接调用外壳,要么小心逃脱   危险的输入,或使用路径/文件路径包的Glob函数。至   扩展环境变量,请使用软件包os的ExpandEnv。