【问题标题】:Call system package with Go on App Engine Standard使用 Go on App Engine Standard 调用系统包
【发布时间】:2019-11-08 19:26:25
【问题描述】:

我正在尝试在运行于Google App Engine StandardGo 应用程序中使用FFmpeg。当我使用 exec.Command() 指向 FFmpeg 二进制文件的本地实例时,我可以让它在本地运行

cmd := exec.Command(
    "/Users/justin/Desktop/conversion/ffmpeg", // this won't work on a remote server
    "-i", "pipe:0",
    "-ac", "1",
    "-codec:a", "libmp3lame",
    "-b:a", "48k",
    "-ar", "24000",
    "-f", "mp3",
    "pipe:1",
  )

  cmd.Stdin = bytes.NewReader(synthResp.AudioContent)

  var output bytes.Buffer
  cmd.Stdout = &output
  err = cmd.Run()

显然,这在我部署应用程序时不起作用,因此我需要一种方法来指向 FFmpeg 二进制文件的托管版本。对于 go1.11 App Engine 标准环境,ffmpeg 似乎是 system package

什么是“系统包”以及如何使用它们? 当我查找文档时,我在apt-get 上找到了很多文档,但没有关于如何使用它们、App Engine 或其他方式的文档。我是否需要安装它,或者它应该已经是 App Engine 正在运行的容器(?)的一部分?

我是否像调用其他可执行文件一样调用它?如果是这样,我希望这可以工作,但它没有

cmd := exec.Command(
    "ffmpeg", // <------ what should this be?
    "-i", "pipe:0",
    "-ac", "1",
    "-codec:a", "libmp3lame",
    "-b:a", "48k",
    "-ar", "24000",
    "-f", "mp3",
    "pipe:1",
  )

  cmd.Stdin = bytes.NewReader(synthResp.AudioContent)

  var output bytes.Buffer
  cmd.Stdout = &output
  err = cmd.Run()

记录错误,我看到exec: "ffmpeg": executable file not found in $PATH

【问题讨论】:

  • 我可以找到的closest documentation 展示了如何在该环境中通过 Golang 使用另一个标准包。令人困惑的是调用md := exec.Command("convert", "-", "-blur", "0x8", "-") 没有引用它 ImageMagik
  • convert 命令是主要的 ImageMagik 命令之一。 ffmpeg 命令位于 go113 环境中的 $PATH 上,并且可能在 go111 中可用。可执行文件的路径是/usr/bin/ffmpeg。尝试运行 ffmpeg 时遇到什么错误?
  • 我得到的错误的开始是CRITICAL: panic: runtime error: invalid memory address or nil pointer dereference goroutine 38 [running]: google.golang.org/appengine/panic(0x16d11a0, 0x1e09b70) /usr/local/go/src/runtime/panic.go:522 +0x1b5 cloud.google.com/go/storage.(*ObjectHandle).validate(0x0, 0x17fa960, 0x18c01c0) 输出通过管道传输到谷歌云存储对象。看起来这很恐慌,因为对 ffmpeg 的调用没有输出。当我从 cmd;run() 记录输出时,我看到 exec: "ffmpeg": executable file not found in $PATH
  • 我在运行时 go113 中使用此处理程序部署了一个应用程序:func h(w http.ResponseWriter, r *http.Request) { cmd := exec.Command("ffmpeg", "-h"); p, err := cmd.CombinedOutput(); fmt.Fprintf(w, "%v %s\n", err, p) }。处理程序按预期打印 ffmpeg 帮助。

标签: google-app-engine go ffmpeg


【解决方案1】:

感谢@iLoveReflection 提出的问题,我意识到应用程序的本地运行版本将调用ffmpeg 命令,期望它位于标准$PATH 环境变量指向的位置。我原以为 App Engine 会识别对 ffmpeg 的调用并使用它安装在自定义位置的可执行文件。

ffmpeg 可执行文件移动到 /usr/local/bin,并确保 $PATH 包含该目录解决了该问题。

【讨论】:

  • 可执行文件安装在 App Engine 的标准位置。没有必要也不可能将可执行文件移动到 /usr/local/bin。
  • 是的。我想我的问题不清楚。当我使用完整路径时,我只能让它在 locally 中运行。我想放弃使用完整路径,而只使用“ffmpeg”,因为完整路径在远程服务器上不起作用。但是在本地调用 'ffmpeg' 不起作用
猜你喜欢
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多