【问题标题】:Can't execute ffprobe command无法执行 ffprobe 命令
【发布时间】:2020-03-08 10:35:17
【问题描述】:

我尝试使用 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”

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

【问题讨论】:

  • 您只在出现错误时查看stderr,而在没有错误时仅查看stdout。你应该检查两者。
  • @Adrian 我完全删除了stderr,它仍然以同样的方式工作
  • 这与我的建议完全相反。
  • csv="p=0"中不需要引号。
  • 再次声明:csv="p=0" 中不需要引号。

标签: go cmd ffprobe


【解决方案1】:

尝试像这样格式化参数(使用双引号代替反引号并删除内部双引号):

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

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

来自the package documentation

与 C 和其他语言的“系统”库调用不同, os/exec 包故意不调用系统 shell 和 不扩展任何 glob 模式或处理其他扩展, 管道,或通常由 shell 完成的重定向。包裹 表现得更像 C 的“exec”函数族。扩展全局 模式,或者直接调用 shell,注意转义任何 危险的输入,或者使用 path/filepath 包的 Glob 函数。到 展开环境变量,使用包os的ExpandEnv。

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2020-06-19
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 2021-03-25
  • 1970-01-01
  • 2020-05-06
相关资源
最近更新 更多