如何与Golang一起使用gobuffalo/packr
我在试着播放一个来自Golang的声音。这是一个.wav文件。我想使用 我在这里创建了一个非常小的项目:使用代码 当我在其默认文件夹中运行可执行文件(./packr test)时,声音会播放。 但我遇到的问题是,当我将可执行文件移动到另一个目录时,我在尝试播放声音文件时出错。我想这可能意味着声音文件没有与可执行文件捆绑在一起 这是在Ubuntu上。我正在使用默认情况下经常安装的“play”命令,但如果没有,可以通过以下方式完成:如何与Golang一起使用gobuffalo/packr,go,Go,我在试着播放一个来自Golang的声音。这是一个.wav文件。我想使用 我在这里创建了一个非常小的项目:使用代码 当我在其默认文件夹中运行可执行文件(./packr test)时,声音会播放。 但我遇到的问题是,当我将可执行文件移动到另一个目录时,我在尝试播放声音文件时出错。我想这可能意味着声音文件没有与可执行文件捆绑在一起 这是在Ubuntu上。我正在使用默认情况下经常安装的“play”命令,但如果没有,可以通过以下方式完成: sudo apt-get install sox sudo apt
sudo apt-get install sox
sudo apt-get install sox libsox-fmt-all
要使用“播放”命令,请执行以下操作:
play file_name.extension
为了节省您的查找时间,以下是我的Go代码:
package main
import (
"fmt"
"os/exec"
"github.com/gobuffalo/packr"
)
func main() {
soundsBox := packr.NewBox("./sounds")
if soundsBox.Has("IEEE_float_mono_32kHz.wav") {
fmt.Println("It's there.")
} else {
fmt.Println("It's not there.")
}
args := []string{"-v20", "./sounds/IEEE_float_mono_32kHz.wav"}
output, err := exec.Command("play", args...).Output()
if err != nil {
// Play command was not successful
fmt.Println("Got an error.")
fmt.Println(err.Error())
} else {
fmt.Println(string(output))
}
}
以下是我的输出:
sudo ./packr-test
It's there.
Got an error.
exit status 2
即使已将文件打包到二进制文件中,您仍在文件系统上引用该文件:
args := []string{"-v20", "./sounds/IEEE_float_mono_32kHz.wav"}
output, err := exec.Command("play", args...).Output()
您可以像这样从packr盒中获取文件数据:
bytes, err := soundsBox.FindBytes("IEEE_float_mono_32kHz.wav")
要使用exec.Command()
执行文件,我认为您必须将这些字节写回文件系统:
err := ioutil.WriteFile("/tmp/IEEE_float_mono_32kHz.wav", bytes, 0755)
exec.Command("play", []string{"-v20", "/tmp/IEEE_float_mono_32kHz.wav"}
您可以通过stdin将字节传递给play
,但这取决于play
二进制文件的工作方式
cmd.Stdin = bytes
cmd.Run()
嗯,这似乎是对的。但是,不是每一个用packr打包成二进制的资源都会遇到同样的问题吗?比如说,你打包了一些html文件,然后把它们提供给用户,为什么不把它们重新写回文件系统呢?这取决于你如何使用文件数据。我经常使用packr来嵌入SQL查询、HTML模板、图像、字体等内容,但我从packr框中读取字节,然后将这些字节直接传递给接受
[]字节
参数的函数。您正在调用exec
,这是一个操作系统调用,因此您传递声音文件的方式与在命令行上调用play
的方式相同(即作为文件系统路径)。是的,我明白您的意思。我想你可能是对的。家伙。这意味着我们也可以将声音文件与可执行文件一起分发。要么这样,要么试着找到一些不用调用exec就可以播放文件的方法……我快速浏览了一些Go音频库,周围有一些,但我不确定它们使用起来有多好。这里有一个例子。