无法执行 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”


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


天涯尽头无女友
浏览 89回答 1
1回答

蝴蝶刀刀

尝试像这样格式化参数(对字符串使用双引号而不是反引号并删除内部双引号):cmdArgs := []string{..., "csv=p=0"}Goexec包不会调用系统 shell 来处理参数,因此在指定它们时不需要采取相同的预防措施。在这种情况下,无需将第一个“=”后面的部分用引号引起来。从包文档中:与 C 和其他语言的“系统”库调用不同,os/exec 包有意不调用系统 shell,也不扩展任何 glob 模式或处理通常由 shell 完成的其他扩展、管道或重定向。该包的行为更像是 C 的“exec”函数系列。要扩展 glob 模式,请直接调用 shell,注意转义任何危险输入,或使用 path/filepath 包的 Glob 函数。要扩展环境变量,请使用 os 包的 ExpandEnv。
打开App,查看更多内容
随时随地看视频慕课网APP