我尝试使用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”
那是什么问题以及如何解决?
答案 0 :(得分:2)
尝试像这样格式化参数(对字符串使用双引号而不是反引号,并删除内部双引号):
cmdArgs := []string{..., "csv=p=0"}
Go exec
包不会调用系统外壳程序来处理参数,因此在指定它们时无需采取相同的预防措施。在这种情况下,无需在引号中的第一个“ =”之后包裹该部分。
与使用C和其他语言进行的“系统”库调用不同, os / exec软件包有意不调用系统外壳程序,并且 不会展开任何glob模式或处理其他扩展, 管道,或通常由Shell完成的重定向。包装 行为更像C的“ exec”函数系列。扩大球 模式,要么直接调用外壳,要么小心逃脱 危险的输入,或使用路径/文件路径包的Glob函数。至 扩展环境变量,请使用软件包os的ExpandEnv。