为了账号安全,请及时绑定邮箱和手机立即绑定

无法执行 ffprobe 命令

无法执行 ffprobe 命令

Go
天涯尽头无女友 2023-08-07 10:04:39
我尝试使用 ffprobe 获取视频文件持续时间。当我运行此代码时,出现错误:退出状态1:var out bytes.Buffervar stderr bytes.BuffercmdArgs := []string{"-i", "bunny.mp4", "-show_entries", "format=duration", "-v", "quiet", "-of", `csv="p=0"`}cmd := exec.Command("ffprobe", cmdArguments...)cmd.Stdout = &outcmd.Stderr = &stderrif 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 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

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

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

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

从包文档中:

与 C 和其他语言的“系统”库调用不同,os/exec 包有意不调用系统 shell,也不扩展任何 glob 模式或处理通常由 shell 完成的其他扩展、管道或重定向。该包的行为更像是 C 的“exec”函数系列。要扩展 glob 模式,请直接调用 shell,注意转义任何危险输入,或使用 path/filepath 包的 Glob 函数。要扩展环境变量,请使用 os 包的 ExpandEnv。


查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信