【发布时间】:2019-11-08 19:26:25
【问题描述】:
我正在尝试在运行于Google App Engine Standard 的Go 应用程序中使用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