如何与Golang一起使用gobuffalo/packr

如何与Golang一起使用gobuffalo/packr,go,Go,我在试着播放一个来自Golang的声音。这是一个.wav文件。我想使用 我在这里创建了一个非常小的项目:使用代码 当我在其默认文件夹中运行可执行文件(./packr test)时,声音会播放。 但我遇到的问题是,当我将可执行文件移动到另一个目录时,我在尝试播放声音文件时出错。我想这可能意味着声音文件没有与可执行文件捆绑在一起 这是在Ubuntu上。我正在使用默认情况下经常安装的“play”命令,但如果没有,可以通过以下方式完成: sudo apt-get install sox sudo apt

我在试着播放一个来自Golang的声音。这是一个.wav文件。我想使用

我在这里创建了一个非常小的项目:使用代码

当我在其默认文件夹中运行可执行文件(./packr test)时,声音会播放。 但我遇到的问题是,当我将可执行文件移动到另一个目录时,我在尝试播放声音文件时出错。我想这可能意味着声音文件没有与可执行文件捆绑在一起

这是在Ubuntu上。我正在使用默认情况下经常安装的“play”命令,但如果没有,可以通过以下方式完成:

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音频库,周围有一些,但我不确定它们使用起来有多好。这里有一个例子。