如何在Golang中使用gobuffalo / packr

时间:2019-01-15 04:48:54

标签: go

我正在尝试播放Golang的声音。这是一个.wav文件。我想使用packr

将.wav文件打包到可执行文件中

我在这里创建了一个非常小的项目:packr-test repository,其中包含代码。

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

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

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

1 个答案:

答案 0 :(得分:4)

即使您已将文件打包到二进制文件中,您仍在引用文件系统上的文件:

args := []string{"-v20", "./sounds/IEEE_float_mono_32kHz.wav"}
output, err := exec.Command("play", args...).Output()

您可以像这样从打包器框中获取文件数据:

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()